今回は、こちらの記事でご紹介したペットクリニックの実装で、キーとなるポイントをいくつか解説させて頂きます。
状態管理で利用しているflutter_riverpod
パッケージはこちらです。
https://pub.dev/packages/flutter_riverpod
画面の状態管理というとちょっとあやふやですが、端的に言うと状況に応じて画面項目を変化させることです。
ownerのタブで+ボタンを押すとペット登録画面が開きます。画面イメージはこちらです。
その1 簡単な例



ウィジェット全体で、ボタンと選択された日付を表示するテキストがあります。
以下はこのウィジェットのコードの一部です。(全体はこちらのリンクからご覧になれます)
このウィジェットは CosumerWidget を継承しており、第二引数に
その結果、この
その2 やや複雑な例
まず、このペットクリニックの仕様ですが、タブによってAPIを呼び出すタイミングを変えています。
タブ | APIを呼び出すタイミング |
owner, pet | タブを初めて開いたときと、ownerタブやpetタブでデータが変更されたときだけ |
veterinarian | タブを開くたび |

それぞれタブが利用するAPIの呼び出し結果は
実際のアプリでは、タブを開く度に最新のデータが表示されることが望ましいかもしれませんが、今回はあえて任意のタイミングでデータの再取得が行われるようにしています。
それではどうやって実現しているか、コードを見ていきましょう。 ownerタブの
注目すべきは下から3行目です。
ref.watch(ownersReloadProvider);
StreamProvider自身が1行目で宣言した別の
例えば、petタブでペットの名前を変更するために、サーバーのPUTリクエストを呼び出し、正常に終了した場合は、以下のコードが呼ばれます。
それぞれのタブでグローバルに宣言したプロバイダーの
ただし、実際にはタブが開かれる前にAPIが呼び出されることはありません。
一方、veterinarian(獣医)のタブは、タブを開く度にAPIが呼ばれるのですが、これは以下のようにコードを書くことで実現しています。

上記のようにStreamProviderのautoDisposeコンストラクタを利用すると、watchしているウィジェットが破棄される(このサンプルの場合は別のタブを開く)と、自動的にこのStreamProvider自身もその状態を破棄します。
それでは長くなりましたので、今回はこのあたりで!
ローカルで動かしながらコードを読んでみたい方は、こちらをどうぞ!