RP:導入 基本設定 - Ki-Kobayashi/flutter_wiki GitHub Wiki
https://riverpod.dev/ja/docs/introduction/getting_started
.

.
「riverpod~」と入力すると、snippetsが表示される
.
- consumer : 👉 Consumer ウィジェットを作成します。
- stlessConsumer : 👉 ConsumerStateless ウィジェットを作成します。
- stfulConsumer : 👉 コンシューマー・ステートフル・ウィジェットを作成する
- stlessHookConsumer : 👉 ステートレスな HookConsumer ウィジェットを作成します。
- stfulHookConsumer : 👉 ステートフルな HookConsumer ウィジェットを作成する
.
- riverpodClass : 👉 クラス・プロバイダを作成します。
- riverpodClassKeepAlive : 👉 クラス・プロバイダを作成します。
- riverpodAsyncClass : 👉 非同期クラス・プロバイダを作成します。
- riverpodAsyncClassKeepAlive : 👉 非同期クラス・プロバイダを作成します。
- riverpodStreamClass : 👉 ストリーム・クラス・プロバイダを作成します。
- riverpodStreamClassKeepAlive : 👉 生存するストリーム・クラス・プロバイダを作成します
- RiverpodPart : 👉 Riverpod 用パート文の作成
.
- listen : 👉 プロバイダの Listenable を作成します。
- riverpod : 👉 シンプルなプロバイダを作成します
- riverpodKeepAlive : 👉 シンプルなキープアライブ・プロバイダの作成
- FutureProvider : 👉 を作成します。
- riverpodFutureKeepAlive : 👉 キープアライブ FutureProvider を作成します。
- riverpodStreamStreamProvider : 👉 を作成します。
- riverpodStreamKeepAlive : 👉 キープアライブStreamProviderを作成します
.
- provider : 👉 シンプルな riverpod プロバイダを作成します
- providerFamily : 👉 ファミリ修飾子を持つプロバイダを作成します。
.
- futureProvider : 👉 FutureProvider を作成します。
- futureProviderFamily : 👉 ファミリ修飾子を持つ FutureProvider を作成します。
. .
- streamProvider : 👉 StreamProvider を作成します。
- futureProviderFamily : 👉 Family修飾子を持つ StreamProvider を作成します。
.
- ChangeNotifierProvider : 👉 ChangeNotifierProvider を作成します。
- changeNotifierProviderFamily : 👉 ファミリー修飾子を持つ ChangeNotifierProvider を作成します。
.
- stateProvider : 👉 StateProvider を作成します。
- stateProviderFamily : 👉 ファミリ修飾子を持つ StateProvider を作成します。
.
- stateNotifierProvider : 👉 StateNotifier プロバイダを作成します。
- stateNotifierProviderFamily : 👉 ファミリ修飾子を持つ StateNotifierProvider を作成します。
- stateNotifier : 👉 StateNotifier を継承し、型を編集できるクラスを作成します。
.
- AsyncNotifierProvider : 👉 AsyncNotifierProvider を作成します。
- asyncNotifierProviderFamily : 👉 ファミリー修飾子を持つ AsyncNotifierProvider を作成します。
- asyncNotifier : 👉 AsyncNotifier クラスを作成します。
- asyncNotifierFamily : 👉 ファミリー・パラメータを持つ AsyncNotifier の作成
.
- notifierProvider : 👉 NotifierProviderを作成します。
- notifierProviderFamily : 👉 ファミリ修飾子を持つ NotifierProvider を作成します。
- notifier : 👉 Notifierクラスを作成します。
- notifierFamily : 👉 Family パラメータを持つ Notifier を作成します。
.
- streamNotifierProvider : 👉 StreamNotifierProvider を作成します。
- streamNotifierProviderFamily : 👉 Family 修飾子を持つ StreamNotifierProvider を作成します。
- streamNotifier : 👉 StreamNotifierクラスを作成します。
- streamNotifierFamily : 👉 ファミリー・パラメータを持つ StreamNotifier を作成します。
.
【pubdev】より下記追加
以下は、riverpod と flutter_hooksの 2つ を利用する場合の例
fvm flutter pub add \
hooks_riverpod \
riverpod_annotation \
dev:riverpod_generator \
dev:build_runner \
dev:custom_lint \
dev:riverpod_lintdependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  freezed_annotation: ^2.4.1
  json_annotation: ^4.8.1
  flutter_hooks: ^0.20.1  👈追加
  hooks_riverpod: ^2.4.0  👈追加
  riverpod_annotation: ^2.1.5    👈追加
  
 ・・・
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^2.0.0
  freezed: ^2.4.1
  json_serializable: ^6.7.1
  build_runner: ^2.4.6
  riverpod_generator: ^2.3.2  👈追加
  riverpod_lint: ^2.1.0  👈追加
  custom_lint: ^0.5.3  👈追加
 ・・・  .
flutter pub add 【dependenciesに追加したいパッケージ名】
flutter pub add dev:【**dev_**dependenciesに追加したいパッケージ名】.
analyzer:
  plugins:
    - custom_lint 👈 riverpod_lintを有効にする
  exclude:
    - "**/*.g.dart"
    - "**/*.freezed.dart"
  errors:
    invalid_annotation_target: ignore 👈freezedが生成したコードを除外し、warningだらけを防ぐ(※json_serializable 未使用なら、不要) .
import 'application.dart';
// 全APIをJson取得にするか
bool isRelease = false;
// 個別にAPIをJson取得( isRelease が false であること)
bool isDevSample = true;
Future<void> main() async {
  // // 初期化が完了するまでSplash表示
  // WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  // FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
  // 💡 `runApp` 関数が終わる前に何か処理を実行する場合は `ensureInitialized()` メソッドを追記する必要がある(provider の override を使用するなど)
  WidgetsFlutterBinding.ensureInitialized();
  // 💡アプリを縦画面のみする(画面回転なし)
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
  ]);
  // google fontsの設定
  GoogleFonts.config.allowRuntimeFetching = kDebugMode;
  // 〇日前表示設定
  timeago.setLocaleMessages("ja", timeago.JaMessages());
  // TODO:検証完了後に以下&関連変数を削除
  if (isRelease) {
    isDevSample = false;
  }
  // 初期化完了後Splash終了
  // FlutterNativeSplash.remove();
  runApp(
    ProviderScope( 👈 ここを追加
      overrides: [
        // 💡SharedPreferences のインスタンス取得は非同期です。
    //    SharedPreferences を使いたいとき、毎回非同期でインスタンスを取得せずに使用するためにも、 Provider を使ってインスタンスをキャッシュ 
        // https://riverpod.dev/ja/docs/concepts/scopes#initialization-of-synchronous-provider-for-async-apis
        sharedPreferencesProvider.overrideWithValue(
          await SharedPreferences.getInstance(),
        ),
        // 
        flutterSecureStorageProvider.overrideWithValue(
          const FlutterSecureStorage(),
        ),
        // TODO:リリース時は、stub用を見ないよう「isDev~」の分岐削除(RestClientのみにする)
        // サンプルデータソース
        xxxDataSourceProvider.overrideWith((ref) => ref.watch(isDevSample
            ? stubXxxDataSourceProvider
            : xxxRestClientProvider)),
      ],
      child: const Application(),
    ),
  );
}
.
- 
APIのDTOは通常、変更されないことが望ましい。 
 👉 Freezedを使用することで、生成されたクラスは不変で再代入不可能なものとなり、意図しない変更が防げられる
- 
FreezedはEquatableの機能を提供しており、等価性の確認が容易。 
 👉これは、APIのResponseオブジェクトなどで特に重要
- 
APIの DTO (Request, Response) を作成する場合 
 👉 Keyが変数名と異なるときは、「@JsonKey(name: 'xxx_xxx')」を使用する
 👉 APIのレスポンスが一部の情報を含まない場合:フィールドが存在しない場合でもエラーが発生せず、デフォルト値が利用
- 
Riverpodで管理する State 作成する場合 
 👉 データがないとき用に、**「@Default('')」**を使用する
- 
Dto 兼 Riverpodで管理する State 作成する場合 
 👉 データがないとき用に、**「@JsonKey(name: 'xxx_xxx')」&「@Default('')」**を使用する
import 'package:freezed_annotation/freezed_annotation.dart';
part 'article.freezed.dart';
part 'article.g.dart';
@freezed
class Article with _$Article {
  const factory Article({
    @Default('') @JsonKey(name: 'article_id') String articleId,
    @Default('') String published,
    @Default('') String title,
    @Default('') String description,
    @Default('') @JsonKey(name: 'image_alt') String imageAlt,
    @Default('') String category,
    @Default('') @JsonKey(name: 'src_url') String srcUrl,
  }) = _Article;
  factory Article.fromJson(Map<String, dynamic> json) =>
      _$ArticleFromJson(json);
}.
.
.
.
.
.
.