Riverpod 提供者始终为空

问题描述

我在我的 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”。)

enter image description here

解决方法

我不会说您创建 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 的当前值。