Flutter - 成功登录和注册后无法从 Firestore 检索数据

时间:2021-04-10 07:50:07

标签: firebase flutter authentication google-cloud-firestore

所以,我想在登录后/成功注册后在我的主屏幕上显示我的应用程序当前用户的名称。

用户数据已正确存储在 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'];
}

2 个答案:

答案 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'];
}
相关问题