What I did (to present loading state example) is:
@freezed
abstract class CounterState with _$CounterState {
const factory CounterState.initial([@Default(0) int value]) = _Initial;
const factory CounterState.loading(int value) = _Loading;
const factory CounterState.current(int value) = _Current;
}
class CounterStateNotifier extends StateNotifier<CounterState>
with LocatorMixin {
CounterStateNotifier() : super(CounterState.initial());
void increment() {
state = CounterState.loading(state.value);
Timer(
Duration(seconds: 1),
() => state = CounterState.current(state.value + 1),
);
}
}
StateNotifierBuilder(
stateNotifier: context.watch<CounterStateNotifier>(),
builder: (context, CounterState state, _) => state.when(
initial: (value) => Text(
'$value',
style: Theme.of(context).textTheme.headline4,
),
loading: (_) => CircularProgressIndicator(),
current: (value) => Text(
'$value',
style: Theme.of(context).textTheme.headline4,
),
),
)
But that is obviously 'hack'. Any tip? Remi Rousselet / Ryan Edge
How to add something like loading state?
I tried:
@freezed abstract class CounterState with _$CounterState { const factory CounterState.initial([@Default(0) int value]) = _Initial; const factory CounterState.loading() = _Loading; const factory CounterState.current(int value) = _Current; }Of course I get an error if I try to use it in notifier, because current looses it:
The getter 'value' isn't defined for the type 'CounterState'.How to go about it?
Thanks