ChangeNotifier 未更新消费者

时间:2021-04-28 07:39:49

标签: flutter flutter-provider flutter-change-notifier

不知道为什么我的 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。但我可以调试它变成真的。

2 个答案:

答案 0 :(得分:1)

据我所知,您正在创建 2 个 LoadingProv 对象。 一种是在初始化 Provider 时

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

一个是当你打电话给某些地方

final loadingProv = LoadingProv();

所以你更新的不是widget上继承的那个,那么你就看不到更新Consumer的值了。

(1)如果你想和create方法一起继续create,你应该通过

调用setGlobalLoading
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),
      ],

答案 1 :(得分:0)

您可以使用此代码读取数据,更改时自动刷新文本小部件

Text(context.watch<LoadingProv>().getGlobalLoadingState.toString());

调用虚空你可以用这个

context.read<LoadingProv>().setGlobalLoading(true);