🐙

Riverpod Generator入門: メリットを知る

2023/03/24に公開

はじめに

Riverpod Generatorを知っていますか?
これは、コード生成でプロバイダーを定義するRiverpodのサイドパッケージで、公式でもコード生成に抵抗がなければ、使用が推奨されています。
この記事はRiverpod Generatorのメリットを説明して、その雰囲気を知ってもらうためのものです。

https://pub.dev/packages/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用のルールです。

https://pub.dev/packages/riverpod_lint

先ほど説明したようにGeneratedProviderはシンプルな構文で生成できるので、Lintの恩恵が受けやすいのでしょう。Riverpod作者のRemiさんが、今後多くのLintルールを追加予定のようなので、その恩恵を最大限うけられることは、Riverpod Generatorを使う大きなメリットでしょう。

https://twitter.com/remi_rousselet/status/1636402872278564872?s=20

Familyプロバイダーで引数の自由度が高い

RiverpodにはFamilyという引数を受け取って、引数ごとに異なるProviderインスタンスを作る仕組みがあります。
ManualProviderのFamilyは引数を1つしか取れないという制限がありましたが、GeneratedProviderではこの点が改善されています。具体的には複数の引数を受け取ったり、Named Parameter・Optional parameterを使ったりと自由度が上がっています。

少し情報が古い記事ですが、以下の章で具体的なコードを説明しています。

https://zenn.dev/toridori/articles/754f097b86911e#family

まとめ

Riverpod Generatorについて簡単に説明してみました。
需要がありそうなら、Riverpod Generatorの具体的な使い方の記事なんかを書こうと思うので、良いと思った人はいいねしてくれると参考になります。

GitHubで編集を提案

Discussion