首页 > 解决方案 > NoSuchMethodError:null 上的无效成员:'_get'

问题描述

完整的错误信息:

The following JSNoSuchMethodError was thrown building FutureBuilder<DocumentSnapshot>(dirty, state: _FutureBuilderState<DocumentSnapshot>#dfc82):
NoSuchMethodError: invalid member on null: '_get'

它来自这一行: UserModel user = UserModel.fromDoc(snapshot.data); 它在:

body: FutureBuilder(
        future: usersRef.doc(widget.userId).get(),
        builder: ( context,  snapshot) {
          List<Widget> children;
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          else if (snapshot.hasData) {
            // print('user snapshot data is: ${snapshot.data}');
            UserModel user = UserModel.fromDoc(snapshot.data);

模型看起来像:

factory UserModel.fromDoc(DocumentSnapshot doc) {
    return UserModel(
      id: doc.data()['id'],
      name: doc.data()['name'],
      username: doc.data()['username'],
      password: doc.data()['password'],
      profileImageUrl: doc.data()['profileImageUrl'],
      email: doc.data()['email'] ,
      userIds: doc.data()['userIds'] ?? '',
    );
  }

我尝试降级 cloud_firestore 的版本,但仍然无法正常工作

标签: fluttergoogle-cloud-firestoreflutter-dependenciesflutter-web

解决方案


正如您的错误日志所说,您正在访问null成员的某些值。

看来,错误在于您的工厂方法。在 Flutter 中,要访问 documentSnapshot 中的所有数据,Map<String, dynamic>必须使用doc.data.

DocumentSnapshot在此之前,我们可以在using中检查文档是否存在doc.exists。如需进一步参考 - https://firebase.flutter.dev/docs/firestore/usage/

我更喜欢处理connectionstate包括错误在内的所有内容,否则您的屏幕会卡在 CircularProgressIndicator 中,用户很难知道原因。

if (snapshot.hasError) {
     return Text("Something went wrong");
} else if (snapshot.connectionState == ConnectionState.done) {
     Map<String, dynamic> data = snapshot.data.data;
     return Widget;
} else {
    return Center(
     child: CircularProgressIndicator());
}

另一种情况:如果firestore中不存在文档,则读取(snapshot.data)将返回null。但是,这种 null 情况由 futurebuilder 内部处理connectionState。根据您的调试结果,由于snapshot.data具有 DocumentSnapshot,因此不会导致错误。


推荐阅读