Riverpod 提供者始终为空
Riverpod provider is always null
我在我的 flutter 应用程序中使用 riverpod 进行状态管理。
Riverpod 为组合提供者提供了一项功能,但我的依赖提供者不更新并且始终 returns null。
通过点击地图上的一个图钉(秘密),我的“selectedSecretProvider”被更新(默认为空)。这应该触发我的音频播放器的初始化。点击播放,当前 _selectedSecret 的声音就会播放。所以我的“selectedTrackProvder”依赖于我的“selectedSecretProvider”:
final selectedTrackProvider = StateNotifierProvider<SelectedTrack, Track>((ref) {
Secret? selectedSecret = ref.watch(selectedSecretProvider);
return SelectedTrack(selectedSecret);
});
这是我选择的曲目class:
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”。)
我不会说您创建 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,而是在尝试调用 play
时选择读取 selectedSecretProvider
的当前值。
我在我的 flutter 应用程序中使用 riverpod 进行状态管理。 Riverpod 为组合提供者提供了一项功能,但我的依赖提供者不更新并且始终 returns null。
通过点击地图上的一个图钉(秘密),我的“selectedSecretProvider”被更新(默认为空)。这应该触发我的音频播放器的初始化。点击播放,当前 _selectedSecret 的声音就会播放。所以我的“selectedTrackProvder”依赖于我的“selectedSecretProvider”:
final selectedTrackProvider = StateNotifierProvider<SelectedTrack, Track>((ref) {
Secret? selectedSecret = ref.watch(selectedSecretProvider);
return SelectedTrack(selectedSecret);
});
这是我选择的曲目class:
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”。)
我不会说您创建 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,而是在尝试调用 play
时选择读取 selectedSecretProvider
的当前值。