我正在制作一个带有 streambuilder 的应用程序,它可以监听 firestore 快照,并从中创建一个项目列表,当我单击其中一个项目时,它会导航到包含该项目详细信息的新屏幕,我也可以在那里修改项目的一些信息,当我尝试更新 firestore 中的项目信息时出现问题,streambuilder 的第一个屏幕用更新的数据重建,而详细信息页面没有更新,流程或多或少是这样的:
这是我的简化代码:
我导航并将异步快照和索引传递到详细信息屏幕的第一个屏幕
class _SalesOrderPenyediaState extends State<SalesOrderPenyedia> {
Widget itemTile(context, SalesOrder element, AsyncSnapshot orderSnap, int index) {
//NAVIGATE TO DETAIL SCREEN
GestureDetector(
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => StreamBuilder<List<SalesOrder>>(
stream: orderStreams,
builder: (context, snapshot) {
return SalesOrderDetailPenyedia(
streamOrder: orderSnap,
index: index,
);
}
),
fullscreenDialog: true,
);}
child : Container()}
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: orderStreams,
builder: (context, AsyncSnapshot<List<SalesOrder>> snapshot) {
ListView(
children: snapshot.data
.asMap()
.map((index, item) => MapEntry(
index, itemTile(context, item, snapshot, index)))
.values
.toList())
}
}),
),
],
),
详情页
class SalesOrderDetailPenyedia extends StatefulWidget {
AsyncSnapshot<List<SalesOrder>> streamOrder;
int index;
SalesOrderDetailPenyedia({ this.index, this.streamOrder});
@override
State<StatefulWidget> createState() => SalesOrderDetailState();
}
class SalesOrderDetailState extends State<SalesOrderDetailPenyedia>{
SalesOrder salesOrder;
OrderServices orderServices = OrderServices();
@override
Widget build(BuildContext context) {
salesOrder = widget.streamOrder.data[widget.index];
return Scaffold(
body : Column()//where i show and update my data
)
}
我是 flutter 的新手,坚持了几天,非常感谢任何建议
最佳答案
我没有看到确切的问题,但是将 asyncSnapshot
传递到详细信息页面并不是很有用,因为它可能会丢失对第一个 streamBuilder
构建器函数的引用它来自。
所以最好的方法是创建一个流(最好是 rxDart
库中的 BehaviorSubject
),然后将您想要的数据添加到其中传递然后将该流传递到详细信息页面。
更新完成后,firebaseResponse 应该返回新数据,或者您手动刷新它,然后通过相同的流将它传递给 Details 小部件。
我可以看到尝试将相同的流向下传递到详细信息页面并节省请求时间的意义(如果你已经拥有显示项目列表所需的数据)但我认为它非常困惑,你可能应该采取另一种方法,我提到的方法或其他更简单的方法。
关于Flutter 如何将单个数据从 Stream 传递到另一个屏幕并进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65645397/