Open3
riverpod tips02
riverpodでProviderをグローバル変数で定義するとまずいのでは?
上記より引用
グローバルで宣言することに不安を覚える方もいるかと思いますが心配はいりません。 プロバイダは完全にイミュータブル(不変)であり、関数をグローバルで宣言することと違いはありません。 また、テスト容易性および保守性が損なわれることはありません。
providerアクセスするためにはrefを使う必要があること。よって値を参照したり変更するにはwidget(ComsumerWidgetとComsunerStatefulWidget)と参照したいprovider以外のproviderのみのアクセスしかできない。またrefをバケツリレーすることで他のクラスからでも参照できる。
その他参考記事
FutureProviderのメリット
- AsyncValueが返ってくる形になっているのでloading, error, dataなどの状態管理が必ず行われる。
- try catchを2重で書く必要がない
- よってResult型が不要?
- 取得した値をキャッシュ化できる。
NotiferでAutoDisposeしたい
AutoDisposeNotifierとAutoDisposeNotifierProviderを使う。
内部実装は見ていないが、refでの参照が消えた場合に ref.onDispose内のログが呼ばれることは確認した。
class IsButtonTappedNotifer extends AutoDisposeNotifier<bool> {
bool build() {
ref.onDispose(() {
logger.i('IsButtonTappedNotiferが削除されました。');
});
return false;
}
void tapped() {
state = true;
}
}
final isButtonTappedProvider =
AutoDisposeNotifierProvider<IsButtonTappedNotifer, bool>(
IsButtonTappedNotifer.new,
);