简体   繁体   English

如何在没有 ConsumerWidget 或 HookWidget 的情况下访问 Riverpod StateNotifier state?

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

I have this class:我有这个 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.并且想要访问 class 中的 state,它扩展了我不想(/不知道如何)更改的 StatefullWidget。 So I can't use 'with' to extend 'ConsumerWidget' or 'HookWidget'.所以我不能使用“with”来扩展“ConsumerWidget”或“HookWidget”。 How do I get the state in this class?这个class中的state怎么得到?

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 .只需在initState中使用context.read(beatCounterProvider)即可。

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]);
   }
 ...
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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