Flutter / Firestore - другой чат создается, когда он уже существует - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь сделать приложение, похожее на 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();
      }),
)

Почему это работает, если под текущим пользователем есть только один чат, ностановится грязно, когда их больше одного?

1 Ответ

0 голосов
/ 14 июня 2019

Хорошо, я понял проблему .......

Глупые ошибки, операторы 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();
      }),
)

Иногда требуется всего лишь минута, чтобы найти решение, которое придет к вам.

...