Flutter 如何将单个数据从 Stream 传递到另一个屏幕并进行更新

标签 flutter dart stream stream-builder

我正在制作一个带有 streambuilder 的应用程序,它可以监听 firestore 快照,并从中创建一个项目列表,当我单击其中一个项目时,它会导航到包含该项目详细信息的新屏幕,我也可以在那里修改项目的一些信息,当我尝试更新 firestore 中的项目信息时出现问题,streambuilder 的第一个屏幕用更新的数据重建,而详细信息页面没有更新,流程或多或少是这样的:

enter image description here

这是我的简化代码:

我导航并将异步快照和索引传递到详细信息屏幕的第一个屏幕

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/

相关文章:

flutter - 使用Android后退按钮重新启动应用程序后,热重装失败吗?

testing - 单元测试期间热装

flutter - 试图在 flutter driver 中获取多个元素(QA 环境)

dart - 如何使 TextFormField 文本在验证时显示在 TextFormField 行下方

c# - Stream.Write 多次或连接字符串和 Stream.Write 一次更好吗?

网页 flutter : text cut off at bottom

flutter - 无法应用正确的逻辑来获取约会日期

flutter - NoSuchMethodError : The method 'drive' was called on null

java - java中BufferedOutputStream有什么好处?不是每个OutputStream都有一个缓冲区吗?

python - 从 python 中已打开的文件中读取两种换行符类型