Riverpod provider is always null

338

I wouldn't say the way you're creating your StateNotifierProvider is wrong, but I think the following is a better approach that should solve your problem.

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

This way you don't create a new StateNotifier every time the selectedSecretProvider updates, instead opting to read the current value of the selectedSecretProvider when attempting to call play.

Share:
338
Martin Seubert
Author by

Martin Seubert

Updated on December 29, 2022

Comments

  • Martin Seubert
    Martin Seubert over 1 year

    I am using riverpod for my state manegement in my flutter app. Riverpod offers a feature for combined providers, but my dependent provider does not update and always returns null.

    By clicking one of the pins (secrets) on the map, my "selectedSecretProvider" is updated (default is null). This should trigger the initialization of my audio player. And by clicking play, the sound of the current _selectedSecret should play. So my "selectedTrackProvder" is dependent on my "selectedSecretProvider":

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

    Here is my selectedTrack 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 ...
     }
     
    }
    

    So why does it always print null, when clicking play? (Btw. my bottom_panel_sheet is showing the correct data and also consumes the "selectedSecretProvider".)

    enter image description here

  • Martin Seubert
    Martin Seubert about 3 years
    Thank you, that solved my problem! I am just wondering why they are showing it in their documentation how I did it? riverpod.dev/docs/concepts/combining_providers
  • Alex Hartford
    Alex Hartford about 3 years
    @MartinSeubert Combining providers is often useful but be aware of cases like this where you could instead read the current value whenever you need it, as opposed to reconstructing your entire state whenever the value changes.