导航到新屏幕时,提供商无法访问

时间:2019-10-08 10:28:06

标签: flutter flutter-provider flutter-navigation

有一个问题,我现在坐了几天。 有一个应用程序,其中:

  • 取决于AUTH状态,显示“ LoginScreen”或“ MainScreen”。

  • 在主屏幕中,我设置了带有屏幕(HomeScreen,ShoppingScreen,MyFavorites)的底部导航

  • 我还使用MultiProvider在此处设置了我的StreamProviders(取决于Auth)
  • 在HomeScreen上,当我使用Provider.of(context)时,它应该像应该一样工作
  • 但是当我使用时:

    `Navigator.push(
      context,
      MaterialPageRoute(
        builder: (_) => ProfileScreen(),
      ),
    );
    

`并在此处使用Provider.of(上下文),我得到“ 找不到正确的Provider。...在此之上...小部件

我读到了一些问题,解决了MaterailApp上方的拒绝提供程序的问题,在我的情况下,我做不到,因为只有在Auth成功后才能设置语言。

尝试将上下文(从HomeScreen)传递到ProfileScreen(通过构造函数),并且可以正常工作,但是当UserData的值更改时,它不会更新屏幕(猜测是由于“上下文”不同)。

在这里,我有什么想法吗?:S

2 个答案:

答案 0 :(得分:1)

请确保您应用程序的根窗口小部件是MaterialWidget窗口小部件,它应是class AppState { User loggedInUser; bool get isLoggedIn { return loggedInUser != null; } // Other states as per the requirements // ... } 的父级。如果已经是这种情况,我将需要您的代码进行研究。像这样

DeviceEventEmitter

答案 1 :(得分:1)

提供商是“范围”的。

这意味着,如果将它们放置在屏幕内,则无法在屏幕外访问它们。

这意味着,如果提供程序是作用域的,但需要在创建它的路径之外进行访问,我们有两种解决方案:

  • 取消提供程序的作用域。这涉及将提供者移动到需要获取值的两个小部件的共同祖先。

    如果这两个小部件位于两条不同的路线上,则基本上意味着“将提供者移至MaterialApp / CupertinoApp上方。

  • 手动将提供程序传递到新屏幕(使用Navigator.push时需要)

    我们的想法是,我们有两个 ,而不是一个一个提供程序,它们都使用与此处所述相同的值。有关实际操作,请参见How to scope a ChangeNotifier to some routes using Provider?例子。

    对于Navigator.push,它看起来像:

    final myModel = Provider.of<MyModel>(context);
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (_) =>
          ChangeNotifierProvider.value(
            value: myModel,
            child: MyScreen(),
        ),
      ),
    );