首页 > 解决方案 > NoSuchMethodError:在 null 上调用了方法“[]”。I/flutter(23049):接收者:null I/flutter(23049):尝试调用:[](“conversationID”)

问题描述

我正在尝试使用 Flutter/dart 语言在我的应用程序中使用 firebase firestore 实现消息功能,但出现以下错误。

NoSuchMethodError:在 null 上调用了方法“[]”。

I/颤振(23049):接收器:空

I/flutter(23049):尝试调用:[](“conversationID”)

火库功能:

"use strict";
Object.defineProperty(exports, "__esModule",{value: true});
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.onConversationCreated = 
functions.firestore.document("Conversations/{conversationID}")
.onCreate((snapshot, context) => {
    let data = snapshot.data();
    let conversationID = context.params.conversationID;
    if (data) {
        let members = data.members;
        for (let index = 0; index < members.length; index++) {
            let currentUserID = members[index];
            let remainingUserIDs = members.filter((u) => u !== currentUserID);
            remainingUserIDs.forEach((m) => {
                return admin.firestore().collection("Users").doc(m).get().then((_doc) => {
                    let userData = _doc.data();
                    if (userData) {
                        return admin.firestore().collection("Users").doc(currentUserID).collection("Conversations").doc(m).create({
                            "conversationID": conversationID,
                            "image": userData.image,
                            "name": userData.name,
                            "unseenCount": 0,
                        });
                    }
                    return null;
                }).catch(() => { return null; });
            });
        }
    }
    return null;
});

Flutter 数据库服务类:

      Future<void> createOrGetConversartion(String _currentID, String _recepientID,
      Future<void> _onSuccess(String _conversationID)) async {
    var _ref = _db.collection(_conversationsCollection);
    var _userConversationRef = _db
        .collection(_userCollection)
        .doc(_currentID)
        .collection(_conversationsCollection);
    try {
      var conversation =
      await _userConversationRef.doc(_recepientID).get();
      if (conversation.data != null) {
        return _onSuccess(conversation.data()["conversationID"]);
      } else {
        var _conversationRef = _ref.doc();
        await _conversationRef.set(
          {
            "members": [_currentID, _recepientID],
            "ownerID": _currentID,
            'messages': [],
          },
        );
        return _onSuccess(_conversationRef.id);
      }
    } catch (e) {
      print(e);
    }
  }

标签: javascriptflutterdartgoogle-cloud-firestore

解决方案


您的空检查在这里似乎不正确。

if (conversation.data != null) {
   return _onSuccess(conversation.data()["conversationID"]);
}

您正在检查是否为conversation.data空,但conversation.data()在空检查后使用。这仅检查该方法是否存在。

而不是这个,你应该做这样的事情。

final data = conversation.data();
if (data != null) {
   return _onSuccess(data["conversationID"]);
}

推荐阅读