FutureProvider
FutureProvider
は非同期操作が可能な Provider であると言えます。
一般的には次のような用途で使われます。
- 非同期操作を実行し、その結果をキャッシュするため(例えばネットワークリクエストなど)。
- 非同期操作の error/loading ステートを適切に処理するため。
- 非同期的に取得した複数の値を組み合わせて一つの値にするため。
FutureProvider
は ref.watch と組み合わせることでその効果を発揮します。
例えば、何かの値が変わったときに自動でデータを再取得するよう設定することで、プロバイダが常に最新データを外部に公開することを保証できます。
備考
FutureProvider
には値を計算する処理を直接変更する手段がありません(ユーザ操作時)。
値を計算するメソッドが複数必要など、より高度なことをする場合は StateNotifierProvider の使用を検討してください。
使用例: 設定ファイルを取得する
FutureProvider
は例えば、次のような用途に適しています: JSON ファイルを外部から読み込み、そのデータをもとに Configuration
オブジェクトを生成、プロバイダの値として外部へ公開する。
ファイルの読み込みはプロバイダ内で async/await を使うことで可能です。 Flutter のアセットからファイルを読み込む場合は、次のようになります。
Future<Configuration> fetchConfiguration(Ref ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;
return Configuration.fromJson(content);
}
UI 側では以下の通り Configuration
を監視します。
Widget build(BuildContext context, WidgetRef ref) {
final config = ref.watch(fetchConfigurationProvider);
return switch (config) {
AsyncError(:final error) => Text('Error: $error'),
AsyncData(:final value) => Text(value.host),
_ => const CircularProgressIndicator(),
};
}
これにより Future が解決すると UI は自動で更新されます。
おまけにキャッシュ機能が働くため、複数のウィジェットがこの Configuration
を必要とする場合でもアセットは一度しか読み込まれません。
そして、ご覧いただける通り FutureProvider
を監視した際の戻り値は AsyncValue です。
AsyncValue のおかげで error/loading などのステートを適切にウィジェットに変換することができます。