Флаттер — слияние двух потоков, показывающих только один набор значений

#flutter #dart

#флаттер #дротик

Вопрос:

У меня есть два потока, и я объединил их следующим образом:

  Stream<List<QuerySnapshot>> getData() {
  Stream stream1 = Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
  Stream stream2 = Firestore.instance.collection('datestoremember').document('Ngrx54m84JbsL0tGvrBeKCBlEnm2').collection('Dates_to_Remember').snapshots();
  return StreamZip([stream1, stream2]);
}
  

Затем я попытался объединить два потока в построителе потоков, но результатом является только один набор значений. Если я изменю имя потока 1 на поток 2 и наоборот, тогда отобразится другой набор значений, что наводит меня на мысль, что при слиянии двух потоков здесь возникает проблема:

 child: StreamBuilder(
            stream: getData(),
            builder: (BuildContext context, AsyncSnapshot<List<QuerySnapshot>> snapshot1) {
            List<QuerySnapshot> querySnapshotData =  snapshot1.data.toList();
            querySnapshotData[0].documents.addAll(querySnapshotData[1].documents);
  

Затем я продолжаю использовать этот querySnapshotData следующим образом:

 if (querySnapshotData[0].documents.isEmpty)
                return Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Center(
                      child: CircularProgressIndicator(),
                    )
                  ],
                );
              if (querySnapshotData[0].documents.length == 0)
                return const Center(
                  child: Text(
                    "Not Available",
                    style: TextStyle(fontSize: 30.0, color: Colors.grey),
                  ),
                );
              return new PageView.builder(
                itemCount: querySnapshotData[0].documents.length,
                controller: PageController(viewportFraction: 0.5),
                onPageChanged: (int index) => setState(() => _index = index),
                itemBuilder: (_, i) {
                  return Transform.scale(
                    scale: i == _index ? 1 : 0.5,
                    child: Card(
                      elevation: 6,
                      shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(10)),
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Text(querySnapshotData[0].documents[i]['Date'].toDate().day.toString()),
                          Text(DateFormat.MMMM()
                              .format(
                              formatter.parse(querySnapshotData[0].documents[i]['Date'].toDate().toString()))
                              .toString()),
                          Padding(
                            padding: const EdgeInsets.only(
                                left: 8.0, right: 8.0),
                            child: FittedBox(
                              fit: BoxFit.contain,
                              child: Text(
                                querySnapshotData[0].documents[i]['Title'],
                                overflow: TextOverflow.ellipsis,
                              ),
                            ),
                          )
                        ],
                      ),
                    ),
                  );
                },
              );},
  

Комментарии:

1. Создайте переменный stream1 = await Firestore.instance.collection в первом.

2. Я добавил await и преобразовал getData в Future, но теперь я получаю ошибку в stream: getData(), в которой говорится, что тип аргумента ‘Future<Stream<List<QuerySnapshot>>>’ не может быть присвоен типу параметра ‘Stream<List<QuerySnapshot>>’.