1

在应用程序主页上,我设置了Model2对数据进行 API 调用的设置。然后用户可以导航到其他页面 ( Navigator.push)。但我想Model2在用户按下(_onBackPress())时进行 API 调用,以便刷新主页上的数据。

问题是 Model2 没有为所有用户初始化。但是,如果我调用final model2 = Provider.of<Model2>(context, listen: false);未初始化 Model2 的用户,则会出错。

我如何只能在有条件的情况下致电提供者?例如:if(user == paid)

StatefulWidget在主页中:

@override
  Widget build(BuildContext context) {
return ChangeNotifierProxyProvider<Model1, Model2>(
initialBuilder: (_) => Model2(),
  builder: (_, model1, model2) => model2
    ..string = model1.string,
),
  child: Consumer<Model2>(
    builder: (context, model2, _) =>

...
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondRoute(context: context)),

在第 2 页中:

Future<void> _onBackPress(context) async {

// if(user == paid)
final model2 = Provider.of<Model2>(context, listen: false);

  return showDialog<void>(
    context: context,
    barrierDismissible: false, 
    builder: (BuildContext context) {
      return 

// if(user == paid)
    Provider.value(value: model2, child:


AlertDialog(
        title: Text('Back'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              Text('Go back'),
            ],
          ),
        ),
        actions: <Widget>[
          FlatButton(
            child: Text('OK'),
            onPressed: () async {

// if(user == paid)
await model2.getData();

              Navigator.of(context).pop();
            },
          ),
        ],
),
      );
    },
  );
}

替代方法(可能更简单):如何在上一页(主页)上调用提供者Navigator.of(context).pop();

TLDR:调用 API 的最佳解决方案是什么,以便在用户返回上一页时刷新数据(但仅适用于某些用户)?

4

2 回答 2

0

您可以将您的第二个页面界面构建器包装在一个WillPopScope小部件中,然后将您想要调用的任何方法传递给小部件的onWillPop回调WillPopScope。这样,您可以在用户按下后退按钮时进行 API 调用。在这篇 WillPopScope Flutter 开发文档文章中找到有关该WillPopScope小部件的更多信息。

于 2019-08-21T15:33:23.487 回答
0

tldr; 在调用可能导致空值或评估为可空引用的提供者之前建立并检查您的单点事实。

也许您可以稍微更改架构以建立单个(可为空或布尔)引用来指示用户是否已付款。然后使用 Darts 可空性检查(或只是一个布尔值)来实现您想要的行为。这与您当前的提议不同,因为不需要调用 Provider 来实例化模型。只需在初始化为 null 或 false 的 User 对象中添加一个事实点,然后仅在用户实际付款时更改该逻辑。

以这种方式切换小部件/行为可能是一种解决方案。

考虑的替代方案:

  • 将关键数据点打包到一个单独的库中,以便可以在需要的地方导入这些值。
  • 用于键/值使用的其他状态管理方法。
  • 如果您只想隐藏/显示页面的某些部分,请考虑使用OffStage类或Visibility

参考 Dart 空值检查示例

于 2019-12-28T16:05:06.440 回答