🐙

Riverpod Generatorで生成できるProviderの種類と書き方(1.2.0時点)

2023/02/27に公開

はじめに

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です。

先程までより少し複雑です。

  1. _${クラス名}を継承したクラスを作る
  2. Riverpodアノテーションをつける
  3. 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の種類と書き方についてまとめました。
コード生成これから使おうというときに参考になったら嬉しいです。

GitHubで編集を提案

Discussion