I am trying to populate 2 values in my user profile. The values are name and email. I have implemented a function getCurrentUser which uses firebase authentication to get the current signed in user. I then use the uid for the user to query my users database were the name and email is stored.
Inside the function, if I print current user I get the users instance returning with values name, email and isStudent. When running my app is m getting the following error in the console "Warning: Operand of null-aware operation ‘!’ has type ‘Map<String, dynamic>’ which excludes null." I also get an error on the phone UI saying "LateInitializationError: Field ‘name’ has not been initialized"
Any advice on this is much appreciated!
I have attached the screenshot of the error and code snippet including variables,function and the variable call to display the values.
final _firestore = FirebaseFirestore.instance;
late User loggedInUser;
class MenuLecturerScreen extends StatefulWidget {
static const String id = 'menu_lecturer';
@override
_MenuLecturerScreenState createState() => _MenuLecturerScreenState();
}
class _MenuLecturerScreenState extends State<MenuLecturerScreen> {
final messageTextController = TextEditingController();
final _auth = FirebaseAuth.instance;
late String messageText;
//String name = 'Eoin Irwin';
//String email = '[email protected]';
late String name;
late String email;
@override
void initState() {
super.initState();
getCurrentUser();
}
void getCurrentUser() async {
try {
final user = _auth.currentUser;
await FirebaseFirestore.instance
.collection("users")
.doc(user?.uid)
.get()
.then((value) {
final Map<String, dynamic>? currentUser = value.data();
email = currentUser!['email'];
name = currentUser!['name'];
print(currentUser);
});
//print(FirebaseFirestore.instance.collection("users").doc(user?.uid).get());
if (user != null) {
loggedInUser = user;
print(loggedInUser.email);
}
} catch (e) {
print(e);
}
}
signOut() async {
await _auth.signOut();
Navigator.pushNamed(context, WelcomeScreen.id);
}
@override
Widget build(BuildContext context) {
var drawerHeader = UserAccountsDrawerHeader(
accountName: Text(name),
accountEmail: Text(email),
2
Answers
By adding a ? You mentioned that the map can be null but then if you added ! You are mentioning that is not null and has a value.. try adding ? Instead
Edit
You are using a async method. And after getting data you are not using setState to update the UI.
Also initially name, messageText and email are null. better use nullable data here
Reading map can provide null, for safe case accept null data
And while using it do
Future takes some time to fetch data until then variables are null .