Open3

riverpod tips02

masato_is_a_ snakemasato_is_a_ snake

riverpodでProviderをグローバル変数で定義するとまずいのでは?

https://riverpod.dev/ja/docs/concepts/providers#プロバイダを作成する

上記より引用

グローバルで宣言することに不安を覚える方もいるかと思いますが心配はいりません。 プロバイダは完全にイミュータブル(不変)であり、関数をグローバルで宣言することと違いはありません。 また、テスト容易性および保守性が損なわれることはありません。

providerアクセスするためにはrefを使う必要があること。よって値を参照したり変更するにはwidget(ComsumerWidgetとComsunerStatefulWidget)と参照したいprovider以外のproviderのみのアクセスしかできない。またrefをバケツリレーすることで他のクラスからでも参照できる。

その他参考記事

https://teratail.com/questions/c8uqr4gq2wshr7#reply-1e07uvh6wue6vj

https://riverpod.dev/ja/docs/cookbooks/testing#test-もしくは-testwidgets-の間でステートを共有しない

https://blog.flutteruniv.com/flutter-riverpod/#:~:text=コードとなります。-,グローバルに定義して良いの?,-と思われる

masato_is_a_ snakemasato_is_a_ snake

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,
);