导航到新屏幕时无法访问提供程序

Provider not accesable when Navigate to new screen

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

` 并使用 Provider.of(context) 我得到“找不到正确的提供者....在此之上...小部件

我阅读了一些关于此的问题,解决方案是在 MaterailApp 之上 decler providers,在我的情况下我不能这样做,因为我只能在 Auth 成功后设置 thoese。

尝试将上下文(从 HomeScreen)传递到 ProfileScreen(通过构造函数)并且成功了,但是当 UserData 的值发生变化时,它没有更新屏幕(猜测是因为不同 'contexts')

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

请确保您的应用程序的根小部件是 Provider 小部件,它应该是 MaterialWidget 的父级。如果已经是这种情况,我将需要您的代码进行调查。像这样

class AppState {
 User loggedInUser;

 bool get isLoggedIn {
  return loggedInUser != null;
 }

 // Other states as per the requirements
 // ...
}

提供商是 "scoped"。

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

这意味着如果一个提供者在范围内但需要在创建它的路由之外访问,我们有两个解决方案:

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

    如果这两个小部件在两个不同的路由上,那么它基本上意味着“将提供商移到 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(),
        ),
      ),
    );