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_lint
dependencies:
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);
}
.
.
.
.
.
.
.