首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在条件下调用provider?

如何在条件下调用provider?
EN

Stack Overflow用户
提问于 2019-08-21 23:09:13
回答 2查看 551关注 0票数 1

在app主页上,我设置了Model2,用来调用数据。然后,用户可以导航到其他页面(Navigator.push)。但是我想在用户按下后退(_onBackPress())时从Model2调用API,这样就可以刷新主页上的数据了。

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

如何才能仅在条件下调用Provider?例如:if(user == paid)

首页中的StatefulWidget

代码语言:javascript
复制
@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)),

在Page2中:

代码语言:javascript
复制
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: call API的最佳解决方案是什么,以便在用户返回到上一页时(但仅对某些用户)刷新数据?

EN

回答 2

Stack Overflow用户

发布于 2019-08-21 23:33:23

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

票数 0
EN

Stack Overflow用户

发布于 2019-12-29 00:05:06

tldr;在调用提供程序之前建立并检查您的单点真理点,这可能会导致空值或计算为可为空的引用。

也许你可以稍微改变一下架构,建立一个单一的(可空的或布尔的)引用,表明用户是否已经支付了费用。然后使用Darts的可空性检查(或仅使用bool)来实现您想要的行为。这与您当前的建议不同,因为不需要调用提供程序来实例化模型。只需向初始化为null或false的User对象添加一个真实点,然后仅在用户实际付款时更改该逻辑。

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

考虑的替代方案:

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

参考Dart null-checking samples

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57594576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档