Combining providers
まずは Providers を読んでください。
このガイドでは、プロバイダを組み合わせることについてのすべてを見ていきます。
プロバイダの組み合わせ#
既にシンプルなプロバイダの作り方を紹介しました。 しかし、実際にはプロバイダが他のプロバイダの状態を読み取りたいという状況は多々あります。
そのためには、プロバイダのコールバックに渡された ref オブジェクトを使用し、その watch メソッドを使用します。
一例として、次のようなプロバイダーを考えてみましょう。
次に、cityProviderを使用する別のプロバイダを作成します。
これで終わりです。別のプロバイダに依存するプロバイダを作成しました。
FAQ#
時間の経過とともに Listen している値が変化するとどうなりますか?#
Listen しているプロバイダによっては、得られる値が時間の経過とともに変化することがあります。 例えば、StateNotifierProvider をリッスンしている場合や、 リッスンしているプロバイダが ProviderContainer.refresh / context.refresh で強制的にリフレッシュされた場合などです。
watchを使用すると、Riverpodは値が変更されたことを検知し、必要に応じて 自動的に プロバイダを再実行します。
これは、計算された状態では有効です。 例えば、todo-listを公開するStateNotifierProviderを考えてみましょう。
一般的なユースケースとしては、TODOのリストをUIでフィルタリングして、完了したTODO/未完了のTODOだけを表示するというものがあります。
このようなシナリオを簡単に実現するには、次のような方法があります。
現在選択されているフィルター・メソッドを公開するStateProviderを作成します。
フィルタリングされたTodo-Listを公開するために、フィルタリングメソッドとTodo-Listを組み合わせた別のプロバイダを作ります。
そして、UIはfilteredTodoListProviderを Listen して、フィルタリングされたTodo-Listを聞くことができます。
このようなアプローチをとることで、フィルターやTodoリストのどちらかが変更されたときに、自動的にUIが更新されます。
このアプローチを実際に見るには、Todo List example のソースコードを見てください。
info
この動作は Provider に特有のものではなく、すべてのプロバイダで動作します。
例えば、watch と FutureProvider を組み合わせて、検索機能や設定変更を実装することができます。
このコードは、サービスからキャラクターのリストを取得し、構成が変更されたり、検索クエリが変更されたりするたびに、自動的にリストを再取得します。
Can I read a provider without listening to it?#
プロバイダを Listen せずに読み取ることはできますか?
時には、プロバイダのコンテンツを読み取りたいが、取得した値が変更されたときに、公開された値を再作成することなく、読み取りたいことがあります。
例えば、他のプロバイダから認証用のユーザートークンを読み込むRepositoryのようなものです。
watch を使って、ユーザートークンが変更されるたびに新しいRepositoryを作成することもできますが、
そのようなことをしてもほとんど意味がありません。
このような状況では、read を使用することができます。これは watch と似ていますが、 取得した値が変更されたときにプロバイダがその値の公開を再作成することはありません。
その場合、作成したオブジェクトに ref.read を渡すのが一般的な方法です。
そして、作成されたオブジェクトは、いつでも好きな時にプロバイダを読み取ることができるようになります。
note
また、ref.readではなく、refをオブジェクトに渡すこともできます。
ref.readを渡すことで得られる違いは、コードの冗長性が少し減ることと、オブジェクトが決してref.watchを使わないようにすることだけです。
プロバイダの中で read を 呼ばないでください
オブジェクトの不要な再構築を避けるために read を使用する場合は、My provider updates too often, what can I do? を参照してください。
コンストラクタのパラメータとして read を受け取ったオブジェクトをテストするには?#
Can I read a provider without listening to it? で紹介したパターンを使っている場合は、 どうやってオブジェクトのテストを書けばいいのか悩んでしまうかもしれません。
このような場合は、生のオブジェクトではなく、プロバイダを直接テストすることを検討してください。 そのためには、[ProviderContainer]クラスを使用します。
My provider updates too often, what can I do?#
プロバイダの更新頻度が高いのですが、どうしたらいいですか?
オブジェクトが頻繁に再作成される場合は、プロバイダが気づいていないオブジェクトを Listen している可能性があります。
例えば、Configurationオブジェクトを Listen しているが、hostプロパティしか使っていない、というような場合です。
Configuration オブジェクト全体を Listen することで、host 以外のプロパティが変更されても、プロバイダが再評価されることになり、望ましくない可能性があります。
この問題を解決するには、Configurationの内で必要なもの(つまりhost) だけ を公開する別のプロバイダを作ることです。
オブジェクト全体を Listen するのを避けてください。
必要なものだけを Listen することを勧めます。