所以,我想在登录后/成功注册后在我的主屏幕上显示我的应用程序当前用户的名称。
用户数据已正确存储在 Firebase Cloud Firestore 中,但是当我尝试检索它时,它显示在“null”上调用了 getter。
以下是我得到的错误:
<块引用>以下 NoSuchMethodError 在构建 Home(dirty, 依赖项:[MediaQuery,_InheritedProviderScope], 状态:_HomeState#0a2b0):
getter 'name' 被调用为 null。
接收者:空
尝试调用:姓名
以下是相关代码片段:
主屏幕构建方法:
final userAuthProvider = Provider.of<UserAuthProvider>(context);
导致错误的主屏幕小部件:
CustomText(text: userAuthProvider.userModel.name,size: 22,),
UserAuthProvider 类相关代码:
enum Status { Uninitialized, Unauthenticated, Authenticating, Authenticated }
UserAuthProvider.initialize() : _auth = FirebaseAuth.instance {
_auth.authStateChanges().listen(_onStateChanged);
}
Future<void> _onStateChanged(User firebaseUser) async {
if (firebaseUser == null) {
_status = Status.Uninitialized;
} else {
_user = firebaseUser;
_status = Status.Authenticated;
_userModel = await _userServices.getUserById(firebaseUser.uid);
}
notifyListeners();
}
UserServices 类 getUserById 方法代码:
Future<UserModel> getUserById(String id) =>
_firebaseFirestore.collection(collection).doc(id).get().then((doc) {
return UserModel.fromSnapshot(doc);
});
UserModel 类构造函数代码:
UserModel.fromSnapshot(DocumentSnapshot snapshot) {
_name = snapshot.data()['name'];
_phoneNumber = snapshot.data()['phoneNumber'];
_email = snapshot.data()['email'];
_password = snapshot.data()['password'];
_id = snapshot.data()['id'];
}
答案 0 :(得分:0)
没有提到“userModel”,但我想它是一个看起来像的getter:
UserModel get userModel => _userModel;
对吧?如果是这种情况,请尝试按如下方式更新您的 getByUserId:
Future<UserModel> getUserById(String id) =>
UserModel.fromSnapshot(await _firebaseFirestore.collection(collection).doc(id).get());
答案 1 :(得分:0)
我已经找到了这个问题的解决方案!
获取数据的正确方法是
UserModel.fromSnapshot(DocumentSnapshot snapshot) {
_name = snapshot['name'];
_phoneNumber = snapshot['phoneNumber'];
_email = snapshot['email'];
_password = snapshot['password'];
_id = snapshot['id'];
}