如何在条件上致电提供商?

时间:2019-08-21 15:09:13

标签: flutter dart flutter-provider

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

问题不是所有用户都对Model2进行初始化。但是,如果我为未初始化Model2的用户呼叫final model2 = Provider.of<Model2>(context, listen: false);,则会出现错误。

我如何只能在有条件的情况下致电提供者?例如: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的最佳解决方案,以便当用户返回上一页(但仅适用于某些用户)时可以刷新数据?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

tldr; :在致电提供商之前,建立并检查您的单个事实点   可能会导致值为空或将其评估为可为空的引用。

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

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

已考虑的替代方案:

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

参考 Dart null-checking samples