微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在flutter中合并多个firebase流

如何解决在flutter中合并多个firebase流

伙计,将多个 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,);
                }
              }
            }    
       )
    );
 }
}

这里的大部分答案都使用在 rxdart 中废弃的 Observable 库,当我尝试使用相同的语法来解决使用 Rx.latestCombine2 时,没有数据流。当我尝试将 list 类型的 querySnapshot 传递给流 Stream 时,我收到了一批错误

“List”类没有实例获取器“docs”。 接收器:“_GrowableList”的实例(长度:2) 尝试调用:文档

请告诉我如何将这两个 firebase 流嵌套到 ome 中,或者如何使用 Rx.combineLatest2 方法解决这个问题。

解决方法

语法看起来正确,但是当试图访问每个流的数据时,您必须通过索引访问它,因为快照基本上是一个列表

所以要访问流1和流2的快照,应该像这样访问

snapshot.data[0].docssnapshot.data[1].docs 分别。

您可以组合两个流并在 Ui 中显示列表,并确保根据 T 的类型分配适当的类型 snapshot.data[index].docs


 List<QuerySnapshot> combineLists(
      List<QuerySnapshot> list1,List<QuerySnapshot> list2) {
    List<QuerySnapshot> result = [];
    list1.forEach((element) {
      result.add(element);
    });
    list2.forEach((element) {
      result.add(element);
    });
    return result;
  }

StreamBulder(
 ​stream: combineStream,​builder: (context,AsyncSnapshot<List<QuerySnapshot>> snapshot) {
   ​if (!snapshot.hasData) {
      ​return SliverToBoxAdapter(
        ​child: Center(
          ​child: circularProgressBar(),​),​);
      ​} else {​
         final List<QuerySnapshot> _list=[];
         final List<QuerySnapshot> combineSnapshot =
                    combineLists(snapshot.data[0],snapshot.data[1]);
         ​if (_list.length == 0) {
            ​return addItems();
         ​} else {
             return SliverList(
                ​delegate: SliverChildBuilderDelegate(
                (context,index) {
                     ProductModel model = ProductModel.fromJson(
                     _list[index].data());
                 return cartSourceInfo(model,context,removeCartFunction: 
                    () => removeItemFromUserCart(model.shortInfo));
                 ​},childCount:_list.length,),);
           ​}
        }
   }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。