Riverpodで状態が変わったら何か処理をする
最終更新日:2024-01-02
    
    RiverpodのStateNotifierの状態が変わったタイミングで何か処理をしたい場合(例えばエラー時にSnackbarを表示する等)は、 ref.listenManual()
 を使います。 initState()
 のタイミングで設定するので、 ConsumerStatefulWidget
 を使います。
ConsumerStatefulWidgetを作る
StatefulWidget
 の代わりに ConsumerStatefulWidget
 を継承したクラスを作ります。 createState()
 の戻り値の型が ConsumerState
 になっている点に注意しましょう。
class _LoginScreen extends ConsumerStatefulWidget {
  const _LoginScreen();
  @override
  ConsumerState<ConsumerStatefulWidget> createState() => _LoginScreenState();
}
ConsumerStateを作る
State
 の代わりに consumerState
 を継承したクラスを作ります。
class _LoginScreenState extends ConsumerState<_LoginScreen> {
  @override
  Widget build(BuildContext context) {
    // refが使える
  }
}
initStateでlistenManualを呼ぶ
状態が変わったタイミングでラムダ式の中身が呼ばれます。画面遷移等をしたい場合は WidgetsBinding.instance.addPostFrameCallback()
 を使います。
ProviderSubscription? _subscription;
@override
void initState() {
  super.initState();
  _subscription = ref.listenManual(
    viewModelProvider,
    (previous, next) {
      switch (next) { ... }
    }
  );
}
listenManual直後に中身を実行する
「画面が表示されたタイミングで処理させたい」みたいな場合は、 fireImmediately: true
 を引数に追加します。
ProviderSubscription? _subscription;
@override
void initState() {
  super.initState();
  _subscription = ref.listenManual(
    viewModelProvider,
    (previous, next) {
      switch (next) { ... }
    },
    fireImmediately: true, // これを追加
  );
}
    
