简体   繁体   中英

How to access Riverpod StateNotifier state outside build without ConsumerWidget or HookWidget?

I have this class:

 class BeatCounter extends StateNotifier<int> {
 BeatCounter() : super(8);

 int get counter => state;

 void increment() {
   if (state < 16) {
     state++;
     print('State $state');
   } else
   return;
 }

  void decrement() {
   if (state > 1) {
     state--;
   } else
     return;
   }
 }

   final beatCounterProvider = StateNotifierProvider((ref) => BeatCounter());

And want to access the state inside a class that extends a StatefullWidget that I don't want (/know how to) change. So I can't use 'with' to extend 'ConsumerWidget' or 'HookWidget'. How do I get the state in this class?

class ChordsTrack extends BaseWidget {
  ChordsTrack({Key key, @required this.sample}) : super(key: key);
  final SOUND_SAMPLE sample;

  @override
  _ChordsTrackState createState() => _ChordsTrackState();
} 

class _ChordsTrackState extends BaseState<ChordsTrack> {
  MultitrackChordBassBoxCreator multitrackBox = 
  MultitrackChordBassBoxCreator();

   List<bool> _data = List.generate(***BeatCounter().state***, (i) => false);

   @override
   void on<Signal>(Signal signal) {
    setState(() => _data = AudioEngine.trackdata[widget.sample]);
   }
 ...
 }

Newbie question, I know, but would really appreciate some help.

I solved it this way.

class BeatCounter extends StateNotifier<int> {
  BeatCounter() : super(8);

  static int counter = 8; //*

  void increment() {
     if (state < 16) {
      state++;
      counter++; //*
      } else
        return;
   }

   void decrement() {
     if (state > 1) {
        state--;
        counter--;//*
       } else
       return;
   }
}

Is there a better option?

Just use context.read(beatCounterProvider) in your initState .

class _ChordsTrackState extends BaseState<ChordsTrack> {
  MultitrackChordBassBoxCreator multitrackBox = 
  MultitrackChordBassBoxCreator();

   List<bool> _data;
   
   @override
   void initState(){
      super.initState();
      _data = List.generate(context.read(beatCounterProvider).state, (i) => false);
   }  

   @override
   void on<Signal>(Signal signal) {
    setState(() => _data = AudioEngine.trackdata[widget.sample]);
   }
 ...
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM