【问题标题】:"The operator '[]' isn't defined" error when using .data[] in flutter firestore在flutter firestore中使用.data []时出现“未定义运算符'[]'”错误
【发布时间】:2020-12-11 05:06:35
【问题描述】:

我正在按照 youtube 上的 Net Ninja 教程学习在 Flutter 中使用 Firestore。完成用户身份验证后,每当创建新用户时,这个人就会将用户记录添加到数据库中,为此添加了一个新模型,并传递了 1 个名为“name”的字符串,并且根据我理解的调用,他映射了模型然后使用.data['name'] 从模型中获取该字符串(字符串被称为名称),执行此操作时出现错误The operator '[]' isn't defined for the type 'Map<String, dynamic> Function()' 为什么会出现此错误?

用户名模型

class Username {
  final String name;
  Username({ this.name });
}

databse.dart 文件(以下代码封装在一个名为 DatabaseService 的类中)

  List<Username> _usernameListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.docs.map((doc){
      return Username(
        name: doc.data['name'] ?? '',
      );
    }).toList();
  }

auth.dart

  Future registerWithEmailAndPassword(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      User user = result.user;

      // create a new document for the user with uid
      await DatabaseService(uid: user.uid).updateUserData('user123');
      return _userFromFirebaseUser(user);
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

如果您有任何问题或需要查看更多代码,请在 cmets 中告诉我

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    改变这个:

    name: doc.data['name'] ?? '' 
    

    进入这个:

    name: doc.data()['name'] ?? '' 
    

    data() 现在是一种方法,因此您必须在源代码中添加()

      Map<String, dynamic> data() {
        return _CodecUtility.replaceDelegatesWithValueInMap(
            _delegate.data(), _firestore);
      }
    

    https://github.com/FirebaseExtended/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/document_snapshot.dart#L38

    【讨论】:

      【解决方案2】:

      Firestore 的data 曾经是QueryDocumentSnapshot 的一个属性,但现在它是一个函数,data()

      而且,正如错误消息所暗示的,您正在处理的确实是 Map&lt;String, dynamic&gt; Function(),即返回地图的函数。

      所以,只需添加空括号即可调用函数data

      doc.data()['name']
      

      【讨论】:

        【解决方案3】:

        对我来说,是这样工作的:

        return snapshot.docs.map((doc) {
          return Todo(
            // before
            title: doc.data()['title'],
            // after
            title: (doc.data() as dynamic)['title'],
          );
        }).toList();
        

        在 pubspec.yaml 中:

        environment:
          sdk: ">=2.12.0 <3.0.0"
        ...
        cloud_firestore: ^2.3.0
        firebase_core: ^1.3.0
        

        【讨论】:

        • 这一行节省了我的时间,谢谢!!:title: (doc.data() as dynamic)['title']
        【解决方案4】:
        StreamBuilder<QuerySnapshot>(
                  stream: _fireStore.collection('messages').snapshots(),
                  builder: (context, snapshot){
                    if(!snapshot.hasData){
                      return Center(
                        child: CircularProgressIndicator(
                        // ignore: missing_return
                        backgroundColor: Colors.lightBlueAccent,
                        ),
                      );
                    }
                    final messages = snapshot.data.docs;
                    List<Text> messageWidgets = [];
                    for(var message in messages){
                      final messageText = message.data()['text'];
                      final messageSender = message.data()['sender'];
                      final messageWidget = Text('$messageText from $messageSender');
                      messageWidgets.add(messageWidget);
                    }
        
                    return Column(
                      children: messageWidgets,
                    );
                  }
                ),
        

        【讨论】:

        • 我已经尝试过,但它在最终 messageText = message.data(); 上显示相同的错误行final messageSender = message.data()['sender'];
        • 尝试: message['text'] 和 message['sender'] 。完成
        【解决方案5】:
        messageText = message['text'];
        

        此语法应该适用于您使用的任何更新的插件。

        【讨论】:

          【解决方案6】:

          是的,你应该试试 message['text']

          【讨论】:

          • 你好,我看到你是新人请更具体,回答问题时添加代码sn-p。
          猜你喜欢
          • 2015-05-01
          • 1970-01-01
          • 2021-09-10
          • 2021-07-30
          • 2021-03-15
          • 2021-02-15
          • 1970-01-01
          • 2017-12-26
          • 1970-01-01
          相关资源
          最近更新 更多