Stream Builder 在 Flutter 中的先前数据之上更新数据

Posted

技术标签:

【中文标题】Stream Builder 在 Flutter 中的先前数据之上更新数据【英文标题】:Stream Builder update the data on top of previous data in Flutter 【发布时间】:2020-11-04 22:47:51 【问题描述】:

我正在使用 StreamBuilder 从 firebase 实时数据库中获取数据(我经常更改它。)所以我希望我的 ListView 相应地更新视图。但是假设我有 3 个数据并且我又添加了一个,然后在我重新打开页面之前显示所有 4 个数据低于前 3 个数据(即 7),它正在做什么。

这是我的代码:


 Widget build(BuildContext context) 

  var ref =  FirebaseDatabase.instance.reference().child('Orders');
  List<PendingOrderLoader> pendingOrderLoaderList1 = [];

  
    return Scaffold(
      body: SafeArea(
          child: Column(
            children: <Widget>[

              Container(
                height: 200,
                child: StreamBuilder(
                  stream: FirebaseDatabase.instance.reference().child('Orders').onValue,
                    builder: (BuildContext context, snapshot)
                      if (snapshot.hasData && !snapshot.hasError && snapshot.data.snapshot.value!=null) 
                        DataSnapshot snapshot1 = snapshot.data.snapshot;

                        final key = snapshot1.value.keys;
                        for(var i in key)
                        
                          print(i);
                          PendingOrderLoader pendingOrderLoader1 = new PendingOrderLoader(
                          
                            snapshot1.value[i]['OrderID'],
                            snapshot1.value[i]['Date'],
                            snapshot1.value[i]['Time'],
                           
                          );
                          pendingOrderLoaderList1.add(pendingOrderLoader1);
                        
                        return snapshot.data.snapshot.value == null
                            ? SizedBox()

                            : ListView.builder(
                          scrollDirection: Axis.vertical,
                          itemCount: pendingOrderLoaderList1.length,
                          itemBuilder: (context, index) 
                            return Text("      "+
                                pendingOrderLoaderList1[index].OrderID
                            );
                          ,
                        );
                       else 
                        return   Center(child: CircularProgressIndicator());
                      
                    
                ),
              )


            ],
          )),

    );

  

之前有 3 个数据,删除 1 个后,它会在其下方显示新数据。 我希望它只显示新数据。

【问题讨论】:

【参考方案1】:

定义这个列表

列出pendingOrderLoaderList1 = [];

接收数据后在builder内部

像这样:

Widget build(BuildContext context)  
  var ref =  FirebaseDatabase.instance.reference().child('Orders');
    return Scaffold(
      body: SafeArea(
        child: Column(
         children: <Widget>[

           Container(
            height: 200,
             child: StreamBuilder(
              stream: FirebaseDatabase.instance.reference().child('Orders').onValue,
                builder: (BuildContext context, snapshot)
                  if (snapshot.hasData && !snapshot.hasError && snapshot.data.snapshot.value!=null) 
                    DataSnapshot snapshot1 = snapshot.data.snapshot;
                    List<PendingOrderLoader> pendingOrderLoaderList1 = [];
                    final key = snapshot1.value.keys;
                    for(var i in key)
                    
                      print(i);
                      PendingOrderLoader pendingOrderLoader1 = new PendingOrderLoader(
                      
                        snapshot1.value[i]['OrderID'],
                        snapshot1.value[i]['Date'],
                        snapshot1.value[i]['Time'],
                       
                      );
                      pendingOrderLoaderList1.add(pendingOrderLoader1);
                    
                    return snapshot.data.snapshot.value == null
                        ? SizedBox()

                        : ListView.builder(
                      scrollDirection: Axis.vertical,
                      itemCount: pendingOrderLoaderList1.length,
                      itemBuilder: (context, index) 
                        return Text("      "+
                            pendingOrderLoaderList1[index].OrderID
                        );
                      ,
                    );
                   else 
                    return   Center(child: CircularProgressIndicator());
                  
                
            ),
          )


        ],
      )),

);

  

【讨论】:

以上是关于Stream Builder 在 Flutter 中的先前数据之上更新数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter,是不是可以在没有小部件构建方法的情况下在功能中使用 Firestore Stream Builder?

调用 Navigator Pop 或 Push 时触发 Flutter Stream Builder

在 Flutter 列表视图中删除 Firestore 数据

在java中,Stream.Builder线程是否安全?

如何在 Flutter 中添加 ListView.builder 的填充顶部?

C++Builder 出现 Corrupt Portfolio stream错误修正方法