Как отобразить несколько QuerySnapshots в одном ListView во Flutter, используя Firebase - PullRequest
0 голосов
/ 14 апреля 2020

Flutter + Firebase Question

Я успешно опрашиваю свою Firebase одним запросом и возвращаю результаты в виде ListView, где каждый документ отображается в Card / ListTile. Теперь я хочу вернуть результаты двух запросов (взаимоисключающих, похожих на оператор OR) в одном ListView, но я не могу найти какое-либо решение для этого. Я полагаю, это должна быть простая и легкая процедура для объединения и отображения результатов запроса Firebase.

Я исследовал rxdart и использовал все виды потоковых функций слияния / объединения, но лучшее, что я могу сделать, это вернуть результаты одного запроса, который затем заменяется результатами второго запроса (т.е. результаты второго запроса заменяют первый). Как я могу отобразить оба результата моих запросов в одном ListView (как если бы это были результаты одного запроса, а не двух запросов / потоков)?

В моем home.dart у меня есть следующий код:

StreamProvider<List<Friendship>>.value(
  value: DatabaseService(userEmail: userData.email).a3Friends,
...

Эта функция a3Friends определена в моем файле базы данных:

Stream<List<Friendship>> get a3Friends {
  Stream<List<Friendship>> stream1 = Firestore.instance
    .collection('friendships').where('user1_email', isEqualTo: userEmail).where('user_requested', isEqualTo: '').snapshots().map(_friendshipListFromSnapshot);
  Stream<List<Friendship>> stream2 = Firestore.instance
    .collection('friendships').where('user2_email', isEqualTo: userEmail).where('user_requested', isEqualTo: '').snapshots().map(_friendshipListFromSnapshot);
  return stream1.mergeWith([stream2]);
}

Затем моя функция _friendshipListFromSnapshot также определена в моей базе данных следующим образом:

List<Friendship> _friendshipListFromSnapshot(QuerySnapshot snapshot) {
  return snapshot.documents.map((doc){
    //print(doc.data);
    return Friendship(
      friendshipId: doc.documentID,
      status: doc.data['status'],
      userRequested: doc.data['user_requested'],
      userBlocked: doc.data['user_blocked'],
      user1Email: doc.data['user1_email'],
      user1Name: doc.data['user1_name'],
      user2Email: doc.data['user2_email'],
      user2Name: doc.data['user2_name'],
    );
  }).toList();
}

Наконец, этот список печатается здесь:

class FriendList extends StatefulWidget {
  @override
  _FriendListState createState() => _FriendListState();
}

class _FriendListState extends State<FriendList> {

  @override
  Widget build(BuildContext context) {

    final a3Friends = Provider.of<List<Friendship>>(context) ?? [];

    if (a3Friends.length == 0) {
      return Center(
        child: Image(
        image: AssetImage('assets/coffee_icon.png')
        )
      );
    }    
    else {
      return Container(
        child: ListView.builder(
          shrinkWrap: true,
          itemCount: a3Friends.length,
          itemBuilder: (context, index) {
            return FriendTile(friendship: a3Friends[index]);
          },
        )
      );
    }
  }
}

Приведенный выше код сохраняет и работает без ошибок, но не выполняет то, что я хочу. В настоящее время этот код может выполнять и возвращать запросы от stream1 и stream2, но результаты stream1 сначала печатаются в моем ListView, а затем заменяются результатами stream2 (т.е. в конечном итоге отображаются только результаты из stream2). Я хочу, чтобы оба моих результата из stream1 и stream2 были как-то объединены, объединены или объединены для отображения в моем ListView.

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