我在我的 flutter 应用程序中使用 riverpod 进行状态管理。 Riverpod 为组合提供程序提供了一项功能,但我的依赖提供程序不更新并始终返回 null。
通过点击地图上的一个图钉(秘密),我的“selectedSecretProvider”被更新(默认为空)。这应该会触发我的音频播放器的初始化。通过单击播放,应播放当前 _selectedSecret 的声音。所以我的“selectedTrackProvder”依赖于我的“selectedSecretProvider”:
final selectedTrackProvider = StateNotifierProvider<SelectedTrack, Track>((ref) {
Secret? selectedSecret = ref.watch(selectedSecretProvider);
return SelectedTrack(selectedSecret);
});
这是我选择的Track类:
class SelectedTrack extends StateNotifier<Track> {
SelectedTrack(this.selectedSecret) : super(Track.initial());
Secret? selectedSecret;
@override
void dispose() {
...
}
void initAudioPlayer() {
...
}
Future<int> play() async {
print(selectedSecret);
return ...
}
}
那为什么点击播放时总是打印null? (顺便说一句。我的 bottom_panel_sheet 显示了正确的数据,并且还使用了“selectedSecretProvider”。)
答案 0 :(得分:1)
我不会说您创建 StateNotifierProvider 的方式错误,但我认为以下是可以解决您的问题的更好方法。
final selectedTrackProvider = StateNotifierProvider<SelectedTrack, Track>((ref) {
return SelectedTrack(ref);
});
class SelectedTrack extends StateNotifier<Track> {
SelectedTrack(this.ref) : super(Track.initial());
final ProviderReference ref;
Future<int> play() async {
final selectedSecret = ref.read(selectedSecretProvider);
print(selectedSecret);
return ...
}
}
这样您就不会在每次 selectedSecretProvider
更新时都创建一个新的 StateNotifier,而是在尝试调用 selectedSecretProvider
时选择读取 play
的当前值。