Riverpod Generatorで生成できるProviderの種類と書き方(1.2.0時点)
はじめに
riverpod_generatorはRiverpodのProviderをコード生成できるパッケージです。
最近個人プロジェクトでriverpod_generatorを使ったところ、いつものあれどうやって書くんだっけ?となったので、生成できるProviderの種類と書き方を記事にしてみました。
この記事はRiverpodは使ったことあるけど、コード生成はこれからという人におすすめです。
生成できるProvider
このIssueによるとriverpod_generatorでは4種類のProviderの生成に対応しているようです 👀
- plain objects
Provider - futures
FutureProvider - class variants of the above two
NotifierProviderとAsyncNotifierProvider
の4つです
SteamProviderやStateNotifierProvider/ChangeNotifierProviderは現在サポートしてないようです。
各Providerの書き方です。
Provider
関数にRiverpodアノテーションをつけるとProviderになります。
以下のように書くとProvider<String>が生成されます。(正確にはAutoDisposeProvider<String>)
// hogeProviderを作る場合
String hoge(HogeRef ref) {
return "hoge";
}
// アロー演算子を使った書き方
String hoge(HogeRef ref) => "hoge";
FutureProvider
Providerと同様関数にRiverpodアノテーションをつけますが、返り値がFutureだとFutureProviderになります。
以下のように書くとFutureProvider<String>が生成されます。(正確にはAutoDisposeFutureProvider<String>)
// hogeProviderを作る場合
Future<String> hoge(HogeRef ref) async {
return "hoge";
}
// アロー演算子を使った書き方
Future<String> hoge(HogeRef ref) async => "hoge";
NotifierProvider
従来StateNotifierProviderを使っていたケースでは、NotifierProviderかAsyncNotifierProviderを使います。状態を非同期に初期化したいときはAsyncNotiferProvider、それ以外はNotifierProviderです。
先程までより少し複雑です。
- _${クラス名}を継承したクラスを作る
- Riverpodアノテーションをつける
- buildメソッドをoverrideする
以上でNotifierProviderになります。
以下のように書くとNotifierProvider<Hoge, HogeState>が生成されます。(正確にはAutoDisposeNotifierProvider<Hoge, HogeState>)
class HogeState {
const HogeState();
}
// hogeProviderを作る場合
class Hoge extends _$Hoge {
HogeState build() {
return const HogeState();
}
void huga() {}
}
AsyncNotifierProvider
NotiferProviderと基本は同じですが、buildメソッドの返り値をFutureにしたときはAsyncNotifierProviderになります。
以下のように書くとAsyncNotifierProvider<Hoge, HogeState>が生成されます。(正確にはAutoDisposeAsyncNotifierProvider<Hoge, HogeState>)
class HogeState {
const HogeState();
}
// hogeProviderを作る場合
class Hoge extends _$Hoge {
Future<HogeState> build() async {
return const HogeState();
}
void huga() {}
}
FamilyとAutoDispose
従来のModifiers(.family, .autoDispose)の書き方がriverpod_generatorでは大きく変わっています。
Family
Providerに外部からパラメーターを渡せるFamilyですが、コード生成では自由度があがっています。
関数を使う(Provider、FutureProvider)場合、関数の引数を設定すればFamilyになります。以下のように引数の自由度が高いです。
String hoge(HogeRef ref, String fuga) {
return "hoge";
}
String hoge2(Hoge2Ref ref, {String? fuga}) {
return "hoge";
}
String hoge3(Hoge3Ref ref, {required String fuga}) {
return "hoge";
}
String hoge4(Hoge4Ref ref, {String fuga = 'huga'}) {
return "hoge";
}
String hoge5(Hoge5Ref ref, {String fuga = 'huga', String? piyo}) {
return "hoge";
}
クラスを使う(NotifierProvider、AsyncNotifierProvider)場合、buildメソッドの引数を設定すればFamilyになります。
class Hoge extends _$Hoge {
HogeState build(String piyo) {
return const HogeState();
}
void huga() {}
}
AutoDispose
コード生成を使う場合はデフォルトでAutoDisposeなProviderが生成されます。前半で正確にはAutoDispose〇〇と書いていたのはこのためです。
AutoDisposeでないProviderを作る場合は、@Riverpod(keepAlive: true)とアノテーションを変更します。
(keepAlive: true)
String hoge(HogeRef ref) {
return "hoge";
}
まとめ
ざっくりですが、riverpod_generatorで生成できるProviderの種類と書き方についてまとめました。
コード生成これから使おうというときに参考になったら嬉しいです。
Discussion