如何从 ChangeNotifier 导航?

Posted

技术标签:

【中文标题】如何从 ChangeNotifier 导航?【英文标题】:How to Navigate from ChangeNotifier? 【发布时间】:2019-12-11 07:05:59 【问题描述】:

我正在了解provider + ChangeNotifier for state management,但我找不到任何有关如何从ChangeNotifier 实施导航的官方指南。

假设我们改进了provider_shopper 示例here,因此当用户点击购买时,CartModel 会执行一些购买逻辑,然后导航到订单审核页面。这个导航应该如何实现?

我们是否为CartModel 提供回调,以便它会调用它并触发 UI 上的导航?

【问题讨论】:

【参考方案1】:

可能有一个更简单、更优雅的解决方案,但我只能考虑使用一个页面并取消导航器:

@override
  Widget build(BuildContext context) 
    final appProvider = Provider.of<AppProvider>(context);
    switch (appProvider.getCurrentPage()) 
      case 'home': return homePage(appProvider);break;
      case 'test': return testPage(appProvider,context);break;
      
    return homePage(appProvider);
  

每个“页面”只是一个返回 Wigdet(脚手架)的函数:

Widget testPage(AppProvider appProvider,BuildContext context) 
    return WillPopScope(
      onWillPop: () return controlBackButton(appProvider,context);,
          child: Scaffold(
        appBar: AppBar(
          title: Text('Test Page'),
        ),

换页:

 void changePage(AppProvider appProvider,String page) 
    setState(()  
      appProvider.setCurrentPage(page);
    );
  

除主页外的所有页面都需要包装在 WillPopScope 小部件中,以使后退按钮导航到主屏幕:

 Future<bool> controlBackButton(AppProvider appProvider) async
    setState(() 
       appProvider.setCurrentPage('home');  
    );
    return false;
  

我认为这不是最好的解决方案,而是一个好的开始。

【讨论】:

我很确定这个解决方案不是一个好的解决方案,首先你会失去与平台无关的导航动画,其次你为一个简单的导航编写了所有代码,应该只是一行代码,使用框架已有的东西,我对使用回调的建议更简单。 如果您可以使用代码 sn-ps 发布答案,那就太好了。我遇到的挑战是,如果您使用 ChangeNotifierProvider 包装 MaterialApp,则提供程序将没有 Navigation 对象。 消费者将有一个上下文。我可以给出一个答案,但我希望从社区中得到一个。

以上是关于如何从 ChangeNotifier 导航?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Navigator 中传递 ChangeNotifier?

如何使用 ChangeNotifier & Provide 或 BLOC 从一个地方获取整数值?

ChangeNotifier 安装等效?

如何在 ChangeNotifier 中使用 Futures?

如何关闭 ChangeNotifier Provider Flutter 中的函数

如何显示来自 ChangeNotifier 模型的对话框