Я создаю частный чат для своего приложения. В качестве серверной части я выбрал Firestore, и ниже показано, как структурированы потоки чата и сообщения.
privateChats
— chatId1
— chatId1
— messageId1, messageId2,...
collection
— document
— collection
— documents
вот скриншот
Я пытаюсь получить снимки всех потоков чата (chatId1, chatId2, …) с их соответствующим сообщением (последний документ / сообщение было отправлено) и отображать их, как показано ниже — см. Экран чата
Я пробовал что-то подобное databaseRef.collection('privateChats').where('chatId', whereIn: chatList).snapshots();
Однако потоки, которые возвращаются из приведенных выше снимков, отслеживают изменения только в тех полях, где существует поле createdAt
.
Это дает мне единственную возможность получить индивидуальный снимок для каждого потока чата, подобного этому databaseRef.collection('privateChats').doc('chatId1).collection('chatId1).snapshots();
databaseRef.collection('privateChats').doc('chatId2).collection('chatId2).snapshots();
, и каким-то образом объединить эти снимки в единый поток (я не знаю как)
Итак, мой вопрос: есть ли способ получить снимки каждого потока чата с помощью всего одного запроса при заданном списке идентификаторов чата? Если нет, то какое решение? Стоит ли мне придумать другую структуру облачного хранилища пожаров? Спасибо,
я думаю, вы можете создать документ для каждой комнаты чата … например,
databaseRef.collection('privateChats').doc('chatId1+chatId2')
тогда оба пользователя id1 и id2 могут получить доступ только к документуПривет, спасибо за ответ. Я не совсем понял, что вы имеете в виду. Не могли бы вы прояснить это подробнее? — person scortumee; 03.11.2020
да, в настоящее время он структурирован так, как вы описываете, но немного отличается
databaseRef.collection('privateChats').doc('usertId1-userId2')
другими словамиuserId1-userId2
представляетchatId1
— person scortumee; 03.11.2020я говорю, что вместо того, чтобы слушать два потока, вы можете сделать это одним, создав документ для каждой комнаты чата (которая, очевидно, состоит из двух пользователей), например, `databaseRef.collection (‘privateChats’). doc (‘chatId1 + chatId2 ‘) `где chatId1 — это идентификатор первого пользователя, а chatId2 — это идентификатор второго пользователя. Надеюсь, теперь ты понимаешь — person scortumee; 03.11.2020
я пытаюсь добиться того, чтобы, допустим, у пользователя было 10 сеансов чата (каждый сеанс с другим пользователем). Я хочу прослушать все 10 сеансов чата. — person scortumee; 03.11.2020
тогда проверьте пакет rxdart. у него есть то, что вам нужно — person scortumee; 09.11.2020
Я решил свою проблему, используя функцию rxdart
MergeStream
, как предложил эмир адеджувонпожалуйста, проверьте этот документ stackoverflow.com/help/someone-answers — person scortumee; 10.11.2020
если предоставленный ответ был полезным, пометьте его как принятый, это поможет другим членам сообщества — person scortumee; 11.11.2020
да, я знаю об этой политике и полностью ее поддерживаю. Но фактический ответ не помог. Комментарий к нему был полезен. Так что я проголосовал за единственный комментарий — person scortumee; 11.11.2020