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 数据