根据 Flutter 中的 Provider 值变化在屏幕之间导航

Posted

技术标签:

【中文标题】根据 Flutter 中的 Provider 值变化在屏幕之间导航【英文标题】:Navigating between screens based on the Provider value change in Flutter 【发布时间】:2021-08-01 04:29:06 【问题描述】:

我有一个带有 BLE 通信的颤振应用程序。我已将与 BLE 相关的变量和函数放在 Provider 类中。我的屏幕结构如下:

Home -> ModeSelect -> NormalMode -> NormalDataShow

                   |

                   -> CustomMode -> CustomModeShow

我们控制的设备也有按钮。因此,每当用户按下按钮时,BLE 数据都应该被丢弃,应用程序应该进入 ModeSelect 屏幕。

因此,例如,如果我们在 NormalDataShow 或 CustomMode 屏幕中,并且用户按下按钮,这些屏幕应该关闭并且应用程序必须自动返回到 ModeSelect。

每次用户按下按钮时,设备都会发送一个数据包。我目前收到了这个数据包,并且可以在 Provider 类中处理它的值变化。

我的问题是:发生此类事件后如何在屏幕之间导航?

我已经尝试过了,但一切都搞砸了,_断言失败:第 1995 行 pos 12: '!debugLocked' 发生错误:

@override
  Widget build(BuildContext context) 
    final _bleProvider = Provider.of<BLEProvider>(context, listen: true);
    if (_bleProvider.modeChanged == true) 
      _bleProvider.modeChanged = false;
      _bleProvider.resetScore();
  
      Navigator.of(context).popAndPushNamed('mode');
      return Container();
     else
      return ... // The page main scaffold

【问题讨论】:

命名路由是必须的吗?如果这不是硬性要求,有一个非常简单的方法可以解决这个问题。 不,其实这并不重要。 【参考方案1】:

我会采用类似于 Flutter 团队的 BottomNavigationBar example 的方法。

基本上,有一个 Scaffold 会根据您的提供者的价值更改其属性(主要是 body)。

例如:

enum Page  a, b ,c 

/// This is the private State class that goes with MyStatefulWidget.
class BleApp extends StatelessWidget 
  final Map<Page, Widget> _widgets = 
    Page.a: Text('a'),
    Page.b: Text('b'),
    Page.c: Text('c'),
  ;
  
  @override
  Widget build(BuildContext context) 
    final _bleProvider = Provider.of<BLEProvider>(context, listen: true);
    // Determine what page to show
    final page = Page.a;
    
    return Scaffold(
      appBar: AppBar(
        title: const Text('BLE App'),
      ),
      body: _widgets[page],
    );
  

这是一个简化的示例,但应该可以帮助您入门。

【讨论】:

以上是关于根据 Flutter 中的 Provider 值变化在屏幕之间导航的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Provider 重建不必要的小部件

使用 Flutter Provider 管理嵌套类的状态

Flutter 中的 Bloc Provider 和 Normal Provider 有啥区别?

使用Provider for DI时如何根据Firebase Auth流修改Flutter Firebase Stream监听器?

更改一个 Provider 中的属性会将另一个 Provider 中的属性更改为 List Flutter

flutter中的状态管理Provider