Flutter / Firestore-当已经存在时会创建另一个聊天

时间:2019-06-13 16:24:10

标签: flutter dart google-cloud-firestore chat

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

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

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

通过登录,我的意思是就像您进入实际聊天室之前看到的最新消息和时间戳一样。

日志如下所示,编号的消息用于第一个用户,字母消息用于第二个用户。

正在将聊天记录作为“继承的窗口小部件”添加到当前用户的chats变量中。

日志:

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();
      }),
)

为什么在当前用户下只有一个聊天时却能正常工作,而在一个以上的聊天中却变得凌乱呢?

1 个答案:

答案 0 :(得分:0)

好的,所以我想出了问题.......

愚蠢的错误,for每个循环中的if语句在循环的每个阶段都执行(我假设只有在它确实存在或由于某种原因不存在时才在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();
      }),
)

有时候,只需花一分钟即可找到解决方案的代码。