[英]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.