0

I want to initialize the state of a StateNotifierProvider after resumed in the lifecycle.

// provider
final timerProvider = StateNotifierProvider<TimerNotifier, TimerModel>((ref) {
  return TimerNotifier();
});

// provider for timeleft
final _timeLeftProvider = Provider<String>((ref) {
  return ref.watch(timerProvider).timeLeft;
});

// provider for timeleft
final timeLeftProvider = Provider<String>((ref) {
  return ref.watch(_timeLeftProvider);
});

// provider for buttonState
final _buttonState = Provider<ButtonState>((ref) {
  return ref.watch(timerProvider).buttonState;
});

// provider for buttonState
final buttonProvider = Provider<ButtonState>((ref) {
  return ref.watch(_buttonState);
});
// resumed method lifecycleState
if (state == AppLifecycleState.resumed) {
  // fecthing data from hive
  final lastInsert = await HiveManager.getItem() ?? [];
  String timeLeft = lastInsert.last.countdownValue.toString();
  // Attempting to set the state of the timerProvider
  context.read(timerProvider.notifier).state = TimerModel(timeLeft, ButtonState.initial);
}

My problem is with the last line; my attempt to set the state is not working.

Alex Hartford
  • 5,110
  • 2
  • 19
  • 36

1 Answers1

1

You don't set the state of a StateNotifierProvider external to the StateNotifier class itself. That is how you would interact with a StateProvider.

Instead, create a method that mutates the state within your StateNotifier class.

In your case:

class TimerNotifier extends StateNotifier<TimerModel> {
  ...
  void setTimerModel(TimerModel timerModel) {
    state = timerModel;
  }
  ...
}

Then you can call the method like this:

final timerNotifier = context.read(timerProvider.notifier);
final timerModel = TimerModel(timeLeft, ButtonState.initial);
timerNotifier.setTimerModel(timerModel);
Alex Hartford
  • 5,110
  • 2
  • 19
  • 36