【问题标题】:How to access Riverpod StateNotifier state outside build without ConsumerWidget or HookWidget?如何在没有 ConsumerWidget 或 HookWidget 的情况下在构建外部访问 Riverpod StateNotifier 状态?
【发布时间】:2021-02-26 05:14:52
【问题描述】:

我有这门课:

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

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

【问题讨论】:

    标签: flutter dart riverpod


    【解决方案1】:

    我是这样解决的。

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

    还有更好的选择吗?

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 2022-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        相关资源
        最近更新 更多