【问题标题】:Removing routes disposes Provider and throws error删除路由会释放 Provider 并引发错误
【发布时间】:2020-08-26 00:06:40
【问题描述】:

为了简化我的问题,我有 4 个屏幕。主屏幕、屏幕 2、屏幕 3 和屏幕 4。我在屏幕 2 中初始化了一个 Provider,当我导航到屏幕 3 时,我通过了该提供商。

 Navigator.push(context, 
   MaterialPageRoute(
     builder: (_) {
       return ChangeNotifierProvider<myProvider>.value(
        value: initializedProvider,
          child: Screen2()
          .
          .

当我从屏幕 3 导航到屏幕 4 时,我会这样做

        .. 
         return ChangeNotifierProvider<myProvider>.value(
           value: Provider.of<myProvider>(context, listen: false),
             child: Screen4()

当用户关闭应用程序时,我想删除所有路由并只显示我的登录页面。我通过使用来做到这一点

    Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false );

(我在主页上监听 appLifecycleState 的变化。这就是我开始删除路由的地方。)

我注意到,每次关闭应用程序时,这都会以随机顺序删除路线。有时屏幕 2(我在其中初始化提供程序)首先被删除,这就是我收到错误“提供程序在被处理后使用”的时候。我确信这正在发生,因为屏幕 3 和 4 在处理时仍然有提供程序。

从底部开始移除屏幕时不会发生此错误(当屏幕 4 被移除,然后是屏幕 3,然后是屏幕 2,然后是主页)。我也不想将更改通知程序包裹在我的材料应用程序周围。

我是 Flutter 的新手,所以我想知道解决这个问题的最佳方法。如果它需要更多信息或没有意义,我会重写这个问题。谢谢。

【问题讨论】:

  • 为什么不在 main.dart 中的小部件树顶部初始化提供程序?
  • 我不想把它放在比必要的更高的树上。除非那是所有供应商的标准。我的问题是从任何屏幕关闭应用程序并且提供程序抛出错误。

标签: flutter routes navigation dispose provider


【解决方案1】:

将提供的类传递给屏幕到 Provider.value 是一种反模式。 在您要访问的所有屏幕上方放置一个 Provider(可能在 main.dart 中)。
provider 的意思是把你的子树包装进去,让你的子部件访问它。你不应该把它的价值传递下去。

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多