【Flutter/Dart/Riverpod】ConsumerWidget/ConsumerStatefulWidgetの使い方と違い

この記事からわかること
- Flutter/Dartで状態管理を行うRiverpodとは?
- Consume、ConsumerWidget、ProviderScope、ConsumerStatefulWidgetの使い方と違い
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Xcode:16.0
- Flutter:3.29.2
- Dart:3.7.2
- Riverpod:2.6.1
- Mac M1:Sequoia 15.4
Consumer/ConsumerWidget/ConsumerStatefulWidgetの違い
Riverpodでは登録したProviderへアクセスするためにWidgetRef
型を介する必要があり、ここからProviderの値を「監視(watch)」・「読み取り(read)」が行えるようになります。ただWidgetRef
型はどこからでも参照できるわけではなく、参照できる箇所を明示的に作り出す必要があります。
RiverpodではConsumer
/ConsumerWidget
/ConsumerStatefulWidget
の3つがWidgetRef
型を参照できるように用意されており、それぞれに使い方とメリットが異なります。
Consumer
Consumer
はUIの一部でのみProviderを参照したい場合に使用します。一部のみに制限できるので無駄な範囲に再描画を走らせることなく活用することができるのが大きなメリットです。また局所的な変更で済むので既存でStatelessWidget
やStatefulWidget
を使用していた場合でも簡単に導入することが可能になっています。
- UIの一部でのみProviderを参照したい場合に使用
- 無駄な範囲に再描画を走らせたくない場合
- StatelessWidget / StatefulWidgetにも導入可能
さらに特徴として引数child
に再描画したくないUIを任意のWidget
型で渡すことが可能です。ここで指定したWidget
は引数builder
のWidget Function(BuildContext context, WidgetRef ref, Widget? child)
内のWidget? child
から参照することが可能です。
ConsumerWidget
ConsumerWidget
はWidget単位でProviderを参照したい場合に使用します。Widget単位にはなるので再描画される際もWidget単位になるので注意が必要です。ただStatelessWidget
のように使用することが可能で、Widget build(BuildContext context, WidgetRef ref)
の引数からWidgetRef
型を参照することが可能です。
- Widget単位でProviderを参照したい場合
- Widget単位で再描画を走らせたい場合
- StatelessWidgetのように使用可能
ConsumerStatefulWidget
ConsumerStatefulWidget
もWidget単位でProviderを参照したい場合に使用します。ConsumerWidget
との違いはStatefulWidget
ベースなのでinitState
、dispose、setState
などのライフサイクルメソッドが使えることです。
使用方法はStatefulWidget
と同じような感じでWidgetRef
はthis.ref
で使用することが可能になっています。
- Widget単位でProviderを参照したい場合
- Widget単位で再描画を走らせたい場合
- StatefulWidgetのように使用可能
- ライフサイクルに合わせて使用したい場合
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。