flutter - 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。但我可以调试它实际上是真的。
解决方案
据我了解,您正在创建 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),
],
推荐阅读
- python-3.x - 为什么在 python3.7.4 中运行 grpc demo 时会出现 AttributeError
- java - 如何在 Java 中使用 LIKE % 编写正确的语句
- hyperlink - 是否有一种通用的方法可以在不产生“点击”的情况下缩短 URL?
- c# - 即使我安装了 MVC 并且有 using 语句,也会出现错误“找不到类型或命名空间名称 'SelectList'”
- excel - 转置列并删除重复项
- php - Output multidimentional array
- angular - Push to observable in angular
- python - DataFrame need help to organise columns and rows of a DF
- c++ - QModelIndex as parent?
- python-3.x - How to modify spacy.tokens.doc.Doc tokens with pipeline components in SpaCy