提供程序未更新导航屏幕中的值

Provider not updating values in navigated screen

我有两个屏幕:

  1. 屏幕A:有一个按钮,当用户点击按钮时,方法addLogFolder被调用并通知所有监听器新值。然后导航到屏幕 B。
  2. 屏幕 B:这个屏幕有一个容器,它正在监听模型的变化,在屏幕 A 中点击按钮后它应该变成红色。

发生了什么:

屏幕 B 保持不变。当我调试时,我发现它甚至没有收到新值的通知,所以它一直使用旧值。为什么会这样?

代码如下:

构建屏幕 A 的小部件:

return Scaffold(
body: Container(
child: lightTurquoiseElevatedButton(
                   'Proceed', () {
                    Provider.of<LogFoldersModel>(context, listen: false).changeColor();

                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) =>
                            MyHomePage.customConstructor(1), //go to log list
                      ),
                    );
                  }),
),);

构建屏幕 B 的小部件:

return ChangeNotifierProvider(
    create: (context) => LogFoldersModel(),
    child: Scaffold(
      body: Consumer<LogFoldersModel>(
                    builder: (_, logfolder, __) {
                      return Container(
                        height: 47,
                        width: 276,
                        color: logfolder.color, //color should change here
                        child: Text(
                            'Box that has to change color',
                            textAlign: TextAlign.center,
                            style: TextStyle(
                                color: Colors.white,
                                fontSize: 13,
                                fontWeight: FontWeight.w200)),
                      );
                    },
                  ),
    ),
);

LogFoldersModel() 中的 changeColor 方法

class LogFoldersModel extends ChangeNotifier {
  Color color = new Color(0xff707070);

  changeColor() {
    color = Color(0xff664411);
    notifyListeners();
  }
}

注意:当按钮在屏幕 B 中时它工作正常,但现在我想更新另一个屏幕中的值然后导航到屏幕 B,它不会工作。所以我认为问题可能是我在导航中做错了什么..?

我认为您的 ChangeNotifierProvider 应该将 MaterialApp 小部件包装在 main.dart 中,而不应将任何东西包装在屏幕 B 中。

这将确保您的所有 routes/pages 都可以访问 Provider 及其持有的状态对象/值。

我解释一下

如果您有一个 ChangeNotifierProvider 包装 MaterialApp 和屏幕 B,那么屏幕 B 中的那个正在从 [=11= 隐藏提供者] 当在屏幕 B 内时。因此,您不会从屏幕 A → 屏幕 B 共享状态。屏幕 B 在其自己的提供者范围内。