首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能在颤栗中多次呼叫Firestore.instance吗?

你能在颤栗中多次呼叫Firestore.instance吗?
EN

Stack Overflow用户
提问于 2020-05-10 18:04:54
回答 2查看 751关注 0票数 1

工作与颤振应用程序和云修复插件。似乎您可以随时调用Firestore.instance,但是查看插件文档中的示例应用程序时,它们设置的方式与自述文件不同。它们在主文件中初始化它,然后引用主文件,如下所示:

代码语言:javascript
复制
final FirebaseApp app = await FirebaseApp.configure(
    name: 'test',
    options: const FirebaseOptions(
      googleAppID: '1:79601577497:ios:5f2bcc6ba8cecddd',
      gcmSenderID: '79601577497',
      apiKey: 'AIzaSyArgmRGfB5kiQT6CunAOmKRVKEsxKmy6YI-G72PVU',
      projectID: 'flutter-firestore',
    ),
  );
  final Firestore firestore = Firestore(app: app);

  runApp(MaterialApp(
      title: 'Firestore Example', home: MyHomePage(firestore: firestore)));
}

这需要吗?如果我创建一个流并发送更新该流的任何类型的数据,然后退出应用程序并重新启动它,我就会遇到一个奇怪的流错误。当我试图再次将数据推送到该流时,应用程序就会崩溃。我正在开发一个聊天功能,所以我的聊天页面会将所有的消息都像这样:

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
    DMProfile dmProfile = Provider.of<DMProfile>(context);
    PlayerProfile playerProfile = Provider.of<PlayerProfile>(context);
    return StreamBuilder<List<Message>>(
      stream: Firestore.instance
          .collection('chats')
          .document(widget.chatId)
          .collection('messages')
          .orderBy('timestamp', descending: true)
          .limit(20)
          .snapshots()
          .map((list) =>
              list.documents.map((doc) => Message.fromFirestore(doc)).toList()),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return LoadingPage();
        }
        List<Message> messageStream = snapshot.data;
        if (messages.length == 0) {
          messages = messageStream;
          hasMore = !(messageStream.length < 20);
        } else if (messages.first.timestamp != null &&
            messageStream.first.timestamp != null) {
          if (messageStream.first.timestamp
                  .compareTo(messages.first.timestamp) !=
              0) {
            print('Not equal');
            messages.insert(0, messageStream.first);
          }
        }
        return Expanded(
          child: ListView.builder(
            reverse: true,
            padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
            controller: listScrollController,
            itemCount: messages.length,
            itemBuilder: (context, index) {
              final messageText = messages[index].message;
              final messageSender = messages[index].senderId;

              final currentUser =
                  widget.isPlayer ? playerProfile.userId : dmProfile.userId;

              return MessageBubble(
                imageUrl: messageSender == playerProfile.userId
                    ? playerProfile.imageUrl
                    : dmProfile.imageUrl,
                text: messageText,
                isMe: currentUser == messageSender,
              );
            },
          ),
        );
      },
    );
  }

我发这样的信息:

代码语言:javascript
复制
sendMessage({
    String sender,
    String receiver,
    String message,
    bool isPlayer,
    String dmName,
    String playerName,
    String dmImage,
    String playerImage,
  }) async {
    String sender1 = sender.compareTo(receiver) < 0 ? sender : receiver;
    String sender2 = sender.compareTo(receiver) > 0 ? sender : receiver;
    String chatName = '${sender1}_$sender2';
    await Firestore.instance
        .collection(CHAT_COLLECTION)
        .document(chatName)
        .setData({
      'dm': isPlayer ? receiver : sender,
      'dm_image': dmImage,
      'dm_name': dmName,
      'player': isPlayer ? sender : receiver,
      'player_image': playerImage,
      'player_name': playerName,
      'dm_hidden': false,
      'player_hidden': false,
      'timestamp': FieldValue.serverTimestamp(),
      'dm_seen': isPlayer ? false : true,
      'player_seen': isPlayer ? true : false,
      'last_message': {
        'message': message,
        'sender_name': isPlayer ? playerName : dmName,
        'sender_id': sender,
        'receiver_id': receiver,
      },
    }, merge: true);
    await Firestore.instance
        .collection(CHAT_COLLECTION)
        .document(chatName)
        .collection(MESSAGES_COLLECTION)
        .add({
      'sender_id': sender,
      'receiver_id': receiver,
      'sender_name': isPlayer ? playerName : dmName,
      'message': message,
      'timestamp': FieldValue.serverTimestamp(),
    });
  }

但如果我做这些步骤:

  1. 启动应用程序并转到聊天屏幕(用安卓
  2. 上的后退按钮从应用程序中流出来,重新打开应用程序,然后转到聊天屏幕(流再次启动)
  3. 发送一条消息,我收到以下错误,应用程序崩溃:

E/AndroidRuntime( 21665 ):致命异常:主E/AndroidRuntime(21665):进程: com.crimsonowl.scryer,PID: 21665 E/AndroidRuntime(21665):java.lang.NullPointerException:尝试调用虚拟方法的无效java.lang.NullPointerException空对象引用E/AndroidRuntime(21665):在io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$EventObserver.onEvent(CloudFirestorePlugin.java:451) E/AndroidRuntime(21665):at io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$EventObserver.onEvent(CloudFirestorePlugin.java:433) E/AndroidRuntime(21665):at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$2(com.google.firebase:firebase-firestore@@21.3.0:1025) E/AndroidRuntime(21665):资料来源:6) E/AndroidRuntime(21665):com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(com.google.firebase:firebase-firestore@@21.3.0:42) E/AndroidRuntime(21665):com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown来源:6) E/AndroidRuntime(21665):android.os.Handler.handleCallback(Handler.java:883) E/AndroidRuntime(21665):在android.os.Handler.dispatchMessage(Handler.java:100) E/AndroidRuntime(21665):at com.google.android.gms.internal.tasks.zzb.dispatchMessage(com.google.android.gms:play-services-tasks@@17.0.2:6) E/AndroidRuntime(21665):at android.os.Looper.loop(Looper.java:214) E/AndroidRuntime(21665):at android.app.ActivityThread.main(ActivityThread.java:7356) E/AndroidRuntime(21665):在com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) (原生方法) E/AndroidRuntime(21665):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) E/AndroidRuntime(21665):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) I/Process (21665):发送信号。PID: 21665 SIG: 9

我尝试了所有的方法,尽我所能看了尽可能多的文档,但似乎无法找到解决方案。

EN

回答 2

Stack Overflow用户

发布于 2020-05-11 18:35:27

在浏览了cloud_firestore的github页面并阅读了其他一些发布的问题后,这是一个cloud_firestore更新版本的bug。目前降级为0.13.4+2,它解决了这个问题。将需要密切关注未来的版本和bug修复,看看这个问题何时得到解决。不过,“颤栗”官方软件包得到了极大的支持和频繁的更新。

票数 1
EN

Stack Overflow用户

发布于 2020-05-11 18:40:00

要真正回答标题,是的,您可以多次使用 Firestore.instance。它实际上不是一个函数,所以实际上不需要“调用”。你从一个类中得到一个静态变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61716551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档