Riverpod Generator入門: メリットを知る
はじめに
Riverpod Generatorを知っていますか?
これは、コード生成でプロバイダーを定義するRiverpodのサイドパッケージで、公式でもコード生成に抵抗がなければ、使用が推奨されています。
この記事はRiverpod Generatorのメリットを説明して、その雰囲気を知ってもらうためのものです。
Riverpod Generatorを使うメリット
Riverpod Generatorにはいくつかのメリットがあります。
シンプルな構文
GeneratedProviderでは、StateNotifierProviderなど一部のProviderを廃止することでシンプルな構文を実現しています。
具体的にはGeneratedProviderを書く構文は、StatelessとStatefulの2種類しかありません。
Stateless
ManualProviderのころからあるProvider、FutureProvider、StreamProviderが属します。
Stateless系のProviderは初期化後の値を変更できません。
Statelessの場合Providerは関数として定義します。
関数の返り値の型によってProvider、FutureProvider、StreamProviderのいずれかが生成されます。
// Providerを作る場合
String hoge(HogeRef ref) {
return 'hoge';
}
// FutureProviderを作る場合
Future<String> hoge(HogeRef ref) {
return Future.value('hoge');
}
// StreamProviderを作る場合
Stream<String> hoge(HogeRef ref) {
return Stream.value('hoge');
}
Stateful
Riverpod Generatorのために新しく追加されたNotiferProvider、AsyncNotifierProvider、StreamNotifierProviderが属します。
Stateful系のProviderは初期化後の値をStateとして持ち、Stateを更新することができます。
Statefulの場合Providerはクラスとして定義します。
buildメソッドの返り値の型によってNotiferProvider、AsyncNotifierProvider、StreamNotifierProviderのいずれかが生成されます。
// NotifierProviderを作る場合
class Hoge extends _$Hoge {
HogeState build() {
return const HogeState();
}
void huga() {
// ここでstateを操作
}
}
// AsyncNotifierProviderを作る場合
class Hoge extends _$Hoge {
Future<HogeState> build() {
return Future.value(const HogeState());
}
void huga() {
// ここでstateを操作
}
}
// StreamNotifierProviderを作る場合
class Hoge extends _$Hoge {
Stream<HogeState> build() {
return Stream.value(const HogeState());
}
void huga() {
// ここでstateを操作
}
}
強力なLintサポート
Riverpod LintというRiverpodのためのLintルールを提供するパッケージがあります。Riverpod Lintは必ずしもRiverpod Generatorだけのものではありませんが、その多くはRiverpod Generator用のルールです。
先ほど説明したようにGeneratedProviderはシンプルな構文で生成できるので、Lintの恩恵が受けやすいのでしょう。Riverpod作者のRemiさんが、今後多くのLintルールを追加予定のようなので、その恩恵を最大限うけられることは、Riverpod Generatorを使う大きなメリットでしょう。
Familyプロバイダーで引数の自由度が高い
RiverpodにはFamilyという引数を受け取って、引数ごとに異なるProviderインスタンスを作る仕組みがあります。
ManualProviderのFamilyは引数を1つしか取れないという制限がありましたが、GeneratedProviderではこの点が改善されています。具体的には複数の引数を受け取ったり、Named Parameter・Optional parameterを使ったりと自由度が上がっています。
少し情報が古い記事ですが、以下の章で具体的なコードを説明しています。
まとめ
Riverpod Generatorについて簡単に説明してみました。
需要がありそうなら、Riverpod Generatorの具体的な使い方の記事なんかを書こうと思うので、良いと思った人はいいねしてくれると参考になります。
Discussion