首页 > 解决方案 > ChangeNotifier 不更新消费者

问题描述

不知道为什么我的 ChangeNotifier 不起作用。

这是我的课:

class LoadingProv with ChangeNotifier {
  bool globalLoading;

  void setGlobalLoading(bool truefalse) {
    if (truefalse == true) {
      globalLoading = true;
    } else {
      globalLoading = false;
    }
    notifyListeners();
  }

  bool get getGlobalLoadingState {
    return globalLoading;
  }
}

这是我在 main.dart 中的 Multiprovider:

MultiProvider(
      providers: [
        ChangeNotifierProvider<MapData>(create: (ctx) => MapData()),
        ChangeNotifierProvider<LoadingProv>(create: (ctx) => LoadingProv()),
      ],
      child: MaterialApp(

这是我在 main.dart Widget build(BuildContext context) 中的代码:

Consumer<LoadingProv>(builder: (context, loadingState, child) {
                  return Text(loadingState.getGlobalLoadingState.toString());
                  }),

这就是我调用 setGlobalLoading 的方式:

final loadingProv = LoadingProv();
 loadingProv.setGlobalLoading(true);

不幸的是,我的 loadingState.getGlobalLoadingState 总是打印为 false。但我可以调试它实际上是真的。

标签: flutterflutter-providerflutter-change-notifier

解决方案


据我了解,您正在创建 2 LoadingProv 对象。一是在初始化Provider的时候

ChangeNotifierProvider<LoadingProv>(create: (ctx) => LoadingProv()),

一种是当你打电话给一些地方时

final loadingProv = LoadingProv();

所以你更新的不是小部件上的继承,那么你看不到更新消费者的值。

(1) 如果你想保持 create 和 create 方法一起使用,你应该调用 setGlobalLoading via

Provider.of<LoadingProv>(context).setGlobalLoading(true);

(2) 或者如果你想直接访问像 loadingProv.setGlobalLoading(true) 这样的值,你应该像这样初始化你的提供者

final loadingProv = LoadingProv(); 
MultiProvider(
      providers: [
        ChangeNotifierProvider<MapData>(create: (ctx) => MapData()),
        ChangeNotifierProvider<LoadingProv>.value(value: loadingProv),
      ],

推荐阅读