首页 > 解决方案 > 如何在没有 ConsumerWidget 或 HookWidget 的情况下在构建外部访问 Riverpod StateNotifier 状态?

问题描述

我有这堂课:

 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());

并且想要访问扩展我不想(/知道如何)更改的 StatefullWidget 的类中的状态。所以我不能用'with'来扩展'ConsumerWidget'或'HookWidget'。我如何获得这堂课的状态?

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

新手问题,我知道,但非常感谢一些帮助。

标签: flutterdartriverpod

解决方案


只需context.read(beatCounterProvider)在您的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]);
   }
 ...
 }

推荐阅读