【问题标题】:ChangeNotifierProvider Not Being called未调用 ChangeNotifierProvider
【发布时间】:2019-10-22 15:08:05
【问题描述】:

我的 ChangeNotifierProvider 没有被调用....


  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<MyGlobals>(
        builder: (context) => MyGlobals(),
        child: MaterialApp(
          theme: MyGlobals().GetTheme() == "dark" ? ThemeData(fontFamily: 'ERAS', primaryColor: Colors.black, accentColor: Colors.amberAccent, secondaryHeaderColor: Colors.black54):
          ThemeData(fontFamily: 'ERAS', primaryColor: Colors.white, accentColor: Colors.black, secondaryHeaderColor: Colors.white70),
          home: MyHomePage(),
        ));
  }
}

这是 MyGlobals:

String _theme = "dark";

class MyGlobals with ChangeNotifier {


  getTheme() => _theme;


  void setTheme(String _themecolor) {
    _theme = _themecolor;
    notifyListeners();
  }
}

我没有收到任何错误,只是没有被调用。我正在从另一个 .dart 文件调用 setTheme 并且它不是 changenotifierprovider 没有被调用。 MyGlobals 是与上面的 ChangeNotifierProvider 代码分开的 .dart 文件。

【问题讨论】:

  • 你需要一个 Consumer 来监听变化
  • 您能具体说明一下吗?
  • 我的意思是,你在哪里调用setTheme 方法?你能添加你的 MyHomePage 小部件
  • 没有位于不同 .dart 文件中的 MyGlobals 类。我也想保持这种状态。
  • 你打电话给setTheme 吗?

标签: android-studio flutter dart listener provider


【解决方案1】:

您需要一个Consumer 小部件来监听您在Model 中所做的更改,如下所示:

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<MyGlobals>(
      builder: (context) => MyGlobals(),
      child: Consumer<MyGlobals>(
        builder: (_, model, __) {
          return MaterialApp(
            theme: model.getTheme() == "dark"
                ? ThemeData(
                    fontFamily: 'ERAS',
                    primaryColor: Colors.black,
                    accentColor: Colors.amberAccent,
                    secondaryHeaderColor: Colors.black54)
                : ThemeData(
                    fontFamily: 'ERAS',
                    primaryColor: Colors.white,
                    accentColor: Colors.black,
                    secondaryHeaderColor: Colors.white70),
            home: MyHomePage(),
          );
        },
      ),
    );
  }

然后你可以用这种方式更新你的主题:

Provider.of<MyGlobals>(context).setTheme("your_theme")

【讨论】:

  • 对不起,仍然没有工作。当我调用 setTheme 时,它​​只是没有被调用。
  • 在你的问题中调用 setTheme 时添加代码,我会更新我的答案,我确定你正在创建一个新对象
  • 做到了!我还需要那个消费者吗?为什么我需要 changenotifierprovider 和 consumer。那个消费者是做什么的?
  • 我建议你阅读官方文档:pub.dev/packages/provider,Provider 有两个主要动作“expose”和“read”值,使用 ChangeNotifierProvider 你暴露你的MyGlobals,现在每次你改变/update你的模型,你可以使用Consumer来监听变化。
  • 当然,不客气,你可以在推特上关注我 :) 相同的别名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 2019-12-11
  • 2021-03-18
  • 2021-06-06
  • 2020-09-21
  • 2021-11-14
  • 2021-11-15
相关资源
最近更新 更多