Поставщик Riverpod всегда равен нулю

Я использую Riverpod для управления государством в своем приложении Flutter. Riverpod предлагает функцию для комбинированных провайдеров, но мой зависимый провайдер не обновляется и всегда возвращает null.

При нажатии на одну из булавок (секретов) на карте мой selectedSecretProvider обновляется (по умолчанию - null). Это должно вызвать инициализацию моего аудиоплеера. И при нажатии кнопки воспроизведения должен воспроизводиться звук текущего _selectedSecret. Итак, мой selectedTrackProvder зависит от моего selectedSecretProvider:

final selectedTrackProvider = StateNotifierProvider<SelectedTrack, Track>((ref) {
     Secret? selectedSecret = ref.watch(selectedSecretProvider);
     return SelectedTrack(selectedSecret);
});

Вот мой класс selectedTrack:

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.)

введите описание изображения здесь


person Martin Seubert    schedule 19.04.2021    source источник


Ответы (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 ...
  }
}

Таким образом, вы не создаете новый StateNotifier каждый раз при обновлении selectedSecretProvider, вместо этого вы предпочитаете читать текущее значение selectedSecretProvider при попытке вызвать play.

person Alex Hartford    schedule 19.04.2021
comment
Спасибо, что решили мою проблему! Мне просто интересно, почему они показывают это в своей документации, как я это сделал? riverpod.dev/docs/concepts/combining_providers - person Martin Seubert; 19.04.2021
comment
@MartinSeubert Объединение поставщиков часто бывает полезно, но имейте в виду такие случаи, когда вы можете вместо этого читать текущее значение всякий раз, когда оно вам нужно, в отличие от восстановления всего вашего состояния при изменении значения. - person Alex Hartford; 20.04.2021