【发布时间】:2021-11-12 06:33:06
【问题描述】:
我在 Flutter 中为我的应用创建了一个简单的 Widget Tree 来解决这个问题。
问题是,当我在 SleepSessionData(这是一个 ChangeNotifier 类)中调用该方法时,消费者不会被解雇。
如果在同一个小部件中调用包含notifyListeners() 的方法没有问题,但是当它是两个同级小部件时,除非调用setState,否则消费者不会更新。
还有一张屏幕图片供参考
SleepSessionData 扩展了 ChangeNotifier
void updateSelectedPlaylists(List<String> selectedPlaylists) {
this.selectedPlaylists = selectedPlaylists;
notifyListeners();
_saveData();
}
PlaylistSelectorWidget
void selectedIndex(int index) {
...
context.read<SleepSessionData>().updateSelectedPlaylists(_selectedPlaylistIds);
setState(() {});
}
在我的SettingsWidget 中,我尝试同时使用Consumer Widget 和watch() 方法。但这是因为notifyListeners() 不会触发消费者/观察者。如果我运行setState()(由用户输入触发),ChangeNotifier 中的值会更新。
这是我在main.dart中的MultiProvider
child: MultiProvider(
providers: [
ChangeNotifierProvider<MySleepData>(create: (_) => MySleepData()),
ChangeNotifierProvider<DirectoryData>(create: (_) => DirectoryData()),
FutureProvider<UserData>(
create: (_) => LocalPersistence.getUserData(),
initialData: UserData()),
FutureProvider<SleepSessionData>(
create: (_) => LocalPersistence.getSleepSessionData(),
initialData: SleepSessionData(),
)
],
【问题讨论】:
-
我认为这是因为您将
FutureProvider用于您的SleepSessionData而不是ChangeNotifierProvider。FutureProvider的文档说:“当未来完成时,接受未来并更新家属。” - 所以它只在未来更新时更新,而不是模型/类本身。我建议在那里也使用ChangeNotifierProvider并在此之前评估您的异步getSleepSessionData函数 -
@kounex 感谢您的回复!但我不认为这是问题所在。如果从同一个小部件中调用
read()和watch(),则提供程序和notifyListeners()工作正常。但在这种情况下,它没有。但为了确定,我会测试一下! -
您是否尝试使用
listen:false?
标签: flutter provider flutter-provider