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 的当前值。