【问题标题】:Flutter/Firestore - Another chat is created when one already existsFlutter/Firestore - 当一个聊天已经存在时创建另一个聊天
【发布时间】:2019-06-13 16:24:10
【问题描述】:

我正在尝试在 Flutter 中制作一个类似 Snapchat 的应用,其中包含消息传递和其他内容。这个问题很奇怪。当当前用户没有聊天记录并发送第一条消息时,会创建一个新的聊天然后发送该消息。如果他在故事而不是聊天视图下发送另一条消息,则发送消息并更新聊天日志。

这就是问题所在。当我第一次向另一个用户的故事发送一条新消息时,虽然已经有一个聊天历史记录,所以这将是第二个聊天日志,它会创建一个新的聊天日志并发送消息,但是当我发送第二条消息时同一用户,它为同一用户创建第二个聊天日志,发送消息,然后由于某种原因突然找到上一个聊天日志并更新该日志并再次发送消息。它一直这样做 -> 创建一个新的聊天日志并重复更新旧的聊天日志。当我向前一个用户发送另一条消息时,它会创建多个聊天并使用新消息更新所有聊天。

目标是检查用户之间是否存在聊天,如果存在则只需添加新消息更新聊天日志,如果不存在则创建新聊天并发送消息然后更新聊天记录。

通过日志,我的意思是您在进入实际聊天室之前看到的最近消息和时间戳。

日志看起来像这样,编号的消息是给第一个用户的,字母消息是给第二个用户的。

聊天正在作为继承的小部件添加到当前用户的聊天变量中。

日志:

flutter: No chats for me
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: 1 // Numbers are for the first user
flutter: User chats length: 0
flutter: CHAT IS EMPTY, CREATE NEW CHAT, AND SENT MESSAGE
flutter: New Chat Added
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: 2
flutter: User chats length: 1
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: 3
flutter: User chats length: 1
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: 4
flutter: User chats length: 1
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: A // Letters are for the second user
flutter: User chats length: 1
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: New Chat Added
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: B
flutter: User chats length: 2
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: New Chat Added
flutter: Message Sent
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: C
flutter: User chats length: 3
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: New Chat Added
flutter: Message Sent
flutter: Message Sent
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: D
flutter: User chats length: 4
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: New Chat Added
flutter: Message Sent
flutter: Message Sent
flutter: Message Sent
flutter: Message Sent
flutter: ----------------------------------------
flutter: STARTED
flutter: Message: 5 // When I send a message back to the first user
flutter: User chats length: 5
flutter: CHAT IS NOT EMPTY
flutter: LOOKING FOR CHATS
flutter: FOUND CHAT, MESSAGE SENT, UPDATING CHAT
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: LOOKING FOR CHATS
flutter: DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT
flutter: New Chat Added
flutter: New Chat Added
flutter: New Chat Added
flutter: New Chat Added
flutter: Message Sent
flutter: Message Sent
flutter: Message Sent
flutter: Message Sent
flutter: Message Sent

代码:

Expanded(
  child: TextBox(
      margin: EdgeInsets.only(left: 25.0, right: 25.0),
      controller: this._textEditingController,
      focusNode: this._focusNode,
      hintText: 'Send a message',
      hintStyle: TextStyle(
        color: Config.tColor.withOpacity(0.8),
        fontSize: 15.0,
        fontWeight: FontWeight.w500,
      ),
      keyboardType: TextInputType.text,
      textInputAction: TextInputAction.next,
      textCapitalization: TextCapitalization.sentences,
      fontSize: 15.0,
      fontWeight: FontWeight.w500,
      autoFocus: false,
      autoCorrect: true,
      maxLines: null,
      onChanged: (s) {},
      onSubmitted: (s) async {
        User cUser = InheritedUser.of(context).user;
        print('----------------------------------------');
        print('STARTED');
        print('Message: $s');
        print('User chats length: ${cUser.chats.length}');
        DateTime now = DateTime.now();
        if (cUser.chats.isNotEmpty) {
          print('CHAT IS NOT EMPTY');
          cUser.chats.forEach((chat) async {
            print('LOOKING FOR CHATS');
            if (chat.users.contains(widget.posts[this._index].user) && chat.users.contains(APIs().users.collection.document(cUser.userID))) {
              print('FOUND CHAT, MESSAGE SENT, UPDATING CHAT');
              await this._sendMessage(
                  cUser: cUser,
                  chatID: chat.chatID,
                  messageID: APIs().chats.collection.document().documentID,
                  type: 'Text',
                  message: s,
                  now: now,
                  onSuccess: () {
                    print('Message Sent');
                    this._textEditingController.text = '';
                    FocusScope.of(context).requestFocus(FocusNode());
                    this._countDownSubscription.resume();
                    return;
                  });
              return;
            } else {
              print('DID NOT FIND CHAT, CREATED NEW CHAT, MESSAGE SENT');
              await this._createChat(
                  cUser: cUser,
                  now: now,
                  then: (chatID) async {
                    await this._sendMessage(
                        cUser: cUser,
                        chatID: chatID,
                        messageID: APIs().chats.collection.document().documentID,
                        type: 'Text',
                        message: s,
                        now: now,
                        onSuccess: () {
                          print('Message Sent');
                          this._textEditingController.text = '';
                          FocusScope.of(context).requestFocus(FocusNode());
                          this._countDownSubscription.resume();
                          return;
                        });
                    return;
                  });
              return;
            }
          });
        } else {
          print('CHAT IS EMPTY, CREATE NEW CHAT, AND SENT MESSAGE');
          await this._createChat(
              cUser: cUser,
              now: now,
              then: (chatID) async {
                await this._sendMessage(
                    cUser: cUser,
                    chatID: chatID,
                    messageID: APIs().chats.collection.document().documentID,
                    type: 'Text',
                    message: s,
                    now: now,
                    onSuccess: () {
                      print('Message Sent');
                      this._textEditingController.text = '';
                      FocusScope.of(context).requestFocus(FocusNode());
                      this._countDownSubscription.resume();
                      return;
                    });
                return;
              });
          return;
        }
      },
      onTap: () {
        this._countDownSubscription.pause();
      }),
)

为什么在当前用户下只有一个聊天时它会起作用,但当有多个时会变得混乱?

【问题讨论】:

    标签: flutter dart google-cloud-firestore chat


    【解决方案1】:

    好的,所以我发现了问题......

    愚蠢的错误,for each 循环中的 if 语句在循环的每个阶段都被执行(我假设它只会在它确实存在或由于某种原因不存在时调用,我想我是累了或其他什么...),因为它会在该点检查每个聊天是否匹配。如果不匹配,则创建一个新的聊天,当匹配时更新它。

    所以一个简单的解决方案:

    Expanded(
      child: TextBox(
          margin: EdgeInsets.only(left: 25.0, right: 25.0),
          controller: this._textEditingController,
          focusNode: this._focusNode,
          hintText: 'Send a message',
          hintStyle: TextStyle(
            color: Config.tColor.withOpacity(0.8),
            fontSize: 15.0,
            fontWeight: FontWeight.w500,
          ),
          keyboardType: TextInputType.text,
          textInputAction: TextInputAction.next,
          textCapitalization: TextCapitalization.sentences,
          fontSize: 15.0,
          fontWeight: FontWeight.w500,
          autoFocus: false,
          autoCorrect: true,
          maxLines: null,
          onChanged: (s) {},
          onSubmitted: (s) async {
            User cUser = InheritedUser.of(context).user;
            DateTime now = DateTime.now();
    
            // Changes Start Here...
            if (cUser.chats.isNotEmpty) {
              String chatID;
              bool doesExists = false;
    
              for (final c in cUser.chats) {
                if (c.users.contains(widget.posts[this._index].user)) {
                  chatID = c.chatID;
                  doesExists = true;
                  break;
                }
              }
    
              if (doesExists) {
                await this._sendMessage(
                    cUser: cUser,
                    chatID: chatID,
                    messageID: APIs().chats.collection.document().documentID,
                    type: 'Text',
                    message: s,
                    now: now,
                    onSuccess: () {
                      this._textEditingController.text = '';
                      FocusScope.of(context).requestFocus(FocusNode());
                      this._countDownSubscription.resume();
                    });
              } else {
                await this._createChat(
                    cUser: cUser,
                    now: now,
                    then: (chatID) async {
                      await this._sendMessage(
                          cUser: cUser,
                          chatID: chatID,
                          messageID: APIs().chats.collection.document().documentID,
                          type: 'Text',
                          message: s,
                          now: now,
                          onSuccess: () {
                            this._textEditingController.text = '';
                            FocusScope.of(context).requestFocus(FocusNode());
                            this._countDownSubscription.resume();
                          });
                    });
              }
            } else {
              await this._createChat(
                  cUser: cUser,
                  now: now,
                  then: (chatID) async {
                    await this._sendMessage(
                        cUser: cUser,
                        chatID: chatID,
                        messageID: APIs().chats.collection.document().documentID,
                        type: 'Text',
                        message: s,
                        now: now,
                        onSuccess: () {
                          this._textEditingController.text = '';
                          FocusScope.of(context).requestFocus(FocusNode());
                          this._countDownSubscription.resume();
                        });
                  });
            }
          },
          onTap: () {
            this._countDownSubscription.pause();
          }),
    )
    

    有时只需一分钟的时间就可以编写出解决方案。

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 2011-04-12
      • 2017-03-05
      • 1970-01-01
      • 2017-04-29
      • 2021-08-25
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多