Существует ли эквивалент Flutter / Dart для IN-запроса в Cloud Firestore Firebase Collection? - PullRequest
1 голос
/ 03 февраля 2020

Я хочу запросить ссылку на коллекцию Firebase со списком нескольких идентификаторов документов в Streambuilder, но, похоже, доступны только

.where()

функций запроса:

Query where(String field, {dynamic isEqualTo, dynamic isLessThan, dynamic isLessThanOrEqualTo, dynamic isGreaterThan, dynamic isGreaterThanOrEqualTo, dynamic arrayContains, bool isNull})

Я протестировал isEqualTo, и это прекрасно работает, если я установил строку для передачи, но я не могу заставить это работать со списком. Похоже, что в официальной документации Firebase есть функция IN, которая бы обеспечивала эту функцию максимум для 10 элементов:

https://firebase.google.com/docs/firestore/query-data/queries#in_and_array -contains-any

Есть ли в Flutter эквивалентная функция IN или есть другой способ добиться этого? Список, который я пытаюсь передать, фактически обслуживается родительским Streambuilder, который запрашивает коллекцию User для указанного пользователя c и передает во всех группах второй Streambuilder:

class _StarredChatState extends State<StarredChat> {

final _firestore = Firestore.instance;
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    final userID = user.uid;   
    return StreamBuilder<QuerySnapshot>( 
      stream: _firestore.collection('users/$userID/chats')
                        .snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(
              backgroundColor: Colors.lightBlueAccent,
            ),
          );
        }
        List<String> ChatIDList = [];
        final ChatIDs = snapshot.data.documents;
        for(var x in ChatIDs) {
          final ChatID = x.data['chats'].toString();
          ChatIDList.add(ChatID);
        }

        return StreamBuilder<QuerySnapshot>(
          stream: _firestore.collection('chatrooms')
                            // here is where I need the IN operator as neither
                            // arraycontains or isEqualTo give the desired result
                            .where('description', arrayContains: ChatIDList)
                            .snapshots(),
          builder: (context, snapshot) {

          if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(
              backgroundColor: Colors.lightBlueAccent,
            ),
          );
        }
          //Here is where I want to return a ListBuilder for the above returned 
          //Streambuilder list

          }

          );


      }
    );
  }
}

Моя другая попытка в него были включены все пользователи, которые присоединились к чату в качестве подколлекции в отдельном документе чата, но поскольку у них есть уникальные идентификаторы autoID, я не могу создать поток всех чатов с указанным пользователем c, поскольку не могу пройти полный путь к вложенной коллекции. Любые другие указатели будут по достоинству оценены.

Спасибо

1 Ответ

1 голос
/ 03 февраля 2020

Я предполагаю, что вы используете старую версию плагина FlutterFire cloud_firestore, поскольку оператор whereIn определенно присутствует в текущей версии библиотеки. См. Справочные документы здесь .

Возможно, вы захотите перейти на последнюю версию FlutterFire, чтобы получить оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...