Парень, это настоящая проблема слияния нескольких потоков firebase в один поток. Кто-то должен написать по этому поводу статью или простой видеоурок. Либо с помощью StreamGroup, FlatMap (), Rx.combineLatest, StreamZip или CombineLatestesStream. Я пытался решить эту проблему со вчерашнего дня и не могу получить четких указаний.
class CartPage extends StatefulWidget{
@override
_CartPageState createState() => _CartPageState();
}
class _CartPageState extends State<CartPage> {
// a firebase collection for all items
Stream stream1 = EcommerceApp.firestore
.collection("items")
.where("shortInfo",
whereIn: EcommerceApp.sharedPreferences
.getStringList(EcommerceApp.userCartList))
.snapshots();
// a firebase collection for flash sales items
Stream stream2 = EcommerceApp.firestore
.collection("flashitem")
.where("shortInfo",
whereIn: EcommerceApp.sharedPreferences
.getStringList(EcommerceApp.userCartList))
.snapshots();
List<QuerySnapshot> getList(QuerySnapshot list1) {
List<QuerySnapshot> result = [];
(list1 as List).forEach((element) {
result.add(element);
});
return result;
}
@override
Widget build(BuildContext context) {
Stream combineStream = Rx.combineLatest2(streamA, streamB, (a, b) => [a, b]);
return Scaffold(
appBar: MyAppBar(),
body:CustomScrollView(
slivers: [
SliverToBoxAdapter(
child: Container(
height: 10.0,
),
),
StreamBulder(
stream: combineStream,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return SliverToBoxAdapter(
child: Center(
child: circularProgressBar(),
),
);
} else {
List<QuerySnapshot> _list = [];
_list.addAll(getList(snapshot.data[0]));
_list.addAll(getList(snapshot.data[1]));
if (_list.length == 0) {
} else {
return SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
ProductModel model = ProductModel.fromJson(
_list[index].docs[index].data());
return cartSourceInfo(model, context,
removeCartFunction: () =>
removeItemFromUserCart(model.shortInfo));
},
childCount: childCount: snapshot.hasData ? _list.length : 0,
),
);
}
}
}
)
);
}
}
Большинство ответов здесь используют библиотеку Observable, которая исчерпана в rxdart, и когда я пытаюсь использовать тот же синтаксис для решения с использованием Rx.latestCombine2, потоковая передача данных отсутствует. и когда я пытаюсь передать querySnapshot списка типов в поток Stream ‹List›, я получаю пакет ошибок:
Класс List не имеет экземпляра получателя docs. Получатель: Экземпляр (длина: 2) из '_GrowableList' Попытка вызвать: docs
Пожалуйста, покажите мне, как я могу вложить эти два потока firebase в ome или как я могу использовать метод Rx.combineLatest2 для решения этой проблемы.