【问题标题】:ChangeNotifier not updating ConsumerChangeNotifier 不更新消费者
【发布时间】:2021-07-21 13:13:07
【问题描述】:

不知道为什么我的 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 构建中的代码(BuildContext 上下文):

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

这就是我调用 setGlobalLoading 的方式:

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

不幸的是,我的 loadingState.getGlobalLoadingState 总是打印为 false。但我可以调试它变成了真的。

【问题讨论】:

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


    【解决方案1】:

    据我了解,您正在创建 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),
          ],
    

    【讨论】:

    • 感谢您的帮助!就我而言,我还必须使用 listen:false: Provider.of(context, listen: false) .setGlobalLoading(true);
    【解决方案2】:

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

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

    on 调用 void 你可以使用这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2021-12-02
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      • 2020-11-26
      相关资源
      最近更新 更多