【问题标题】:Flutter Passing Data Between ScreensFlutter 在屏幕之间传递数据
【发布时间】:2021-03-01 20:09:42
【问题描述】:

我正在开发一个显示订单列表的颤振应用程序,它将显示相应的订单详细信息onTap,因为我已经看到了很多关于如何将数据从列表屏幕传递到显示详细信息的屏幕的示例传递的那个对象,我们可以通过widget.obj.name读取数据。但是,就我而言,我想传递其中一个订单的 ID,在这里我可以使用 widget.orderId 从上一个屏幕获取订单 ID,但我无法通过调用获取订单详细信息来检索详细信息API。

为了进一步解释,我将在这里展示我的代码:

orderlist.dart

        onTap: () {
          Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) => OrderDetail(
                      orderId: order.id,
                      onRefresh: onRefresh,
                    )),
          );
      },

order_detail.dart 中,我试图构建 UI,但 model.orderItem.toString() 的结果为空。当我尝试直接运行 Services().getOrderDetails() API 时,它工作得非常好,但因为我有 OrderItem 模型,我将与提供者一起使用它。

 @override
  Widget build(BuildContext context) {
       return ListenableProvider<OrderItemModel>(
          create: (_) => OrderItemModel(),
          child: Consumer<OrderItemModel>(
          builder: (context, model, child) {
              print("orderItem: " + model.orderItem.toString());
          },
      ));
  }

我收到以下错误: 未处理的异常:错误:在此 OrderDetail 小部件上方找不到正确的提供程序。这可能是因为您使用了不包括您选择的提供者的BuildContext。有几种常见的情况:

  • 您尝试读取的提供程序位于不同的路径中。 提供者是“范围的”。因此,如果您在路由中插入提供程序,则其他路由将无法访问该提供程序。
  • 您使用了BuildContext,它是您尝试读取的提供程序的祖先。 确保 OrderDetail 在您的 MultiProvider/Provider 下。这通常发生在您创建提供程序并尝试立即读取它时。

我已经尝试过 Flutter 提供的解决方案,但它仍然给了我同样的错误。为了在orderdetails.dart 中调用 OrderItemModel 提供程序,orderlist.dart 部分是否需要做任何事情?我错过了什么吗?

【问题讨论】:

    标签: api flutter flutter-provider


    【解决方案1】:

    总结:将ListeableProvider 移动更高级别(在orderlist.dart 中),路由被推送到的位置(OrderDetail 应该是它的子级)。

    我认为这可能是因为OrderDetail 不是 OrderList 或任何具有 onTap 操作的小部件的子级。发生这种情况是因为您指定了以OrderDetail 为根的路由,并且它不知道其他小部件的提供者。您需要将其包装成 ChangeNotifierProviderhttps://flutter.dev/docs/development/data-and-backend/state-mgmt/simple#changenotifierprovider 或您正在使用的 ListeneableProvider)并在那里构建 Order Detail。它看起来类似于:

        ....
        builder: (_) => ChangeNotifierProvider.value(value: model, child: OrderDetail(...));
    

    模型将来自OrderList,我假设它是提供者。

    OrderDetail 中,您将需要Consumer&lt;OrderItemModel&gt; 而不是ListeneableProvider

    【讨论】:

      【解决方案2】:

      你可以查看这个passing multiple data example

      如果您不知道获取包裹,请查看此enter link description here

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 2021-03-05
        • 1970-01-01
        • 2018-01-10
        • 1970-01-01
        相关资源
        最近更新 更多