FutureProvider<T> constructor
- Create<
FutureOr< _createFn, {T> , FutureProviderRef<T> > - String? name,
- Iterable<
ProviderOrFamily> ? dependencies, - @Deprecated('Will be removed in 3.0.0') Family<
Object?> ? from, - @Deprecated('Will be removed in 3.0.0') Object? argument,
- @Deprecated('Will be removed in 3.0.0') DebugGetCreateSourceHash? debugGetCreateSourceHash,
A provider that asynchronously creates a value.
FutureProvider can be considered as a combination of Provider and
FutureBuilder
.
By using FutureProvider, the UI will be able to read the state of the
future synchronously, handle the loading/error states, and rebuild when the
future completes.
A common use-case for FutureProvider is to represent an asynchronous operation such as reading a file or making an HTTP request, that is then listened to by the UI.
It can then be combined with:
- FutureProvider.family, to parameterize the http request based on external
parameters, such as fetching a
User
from its id. - FutureProvider.autoDispose, to cancel the HTTP request if the user leaves the screen before the Future completed.
Usage example: reading a configuration file
FutureProvider can be a convenient way to expose a Configuration
object
created by reading a JSON file.
Creating the configuration would be done with your typical async/await syntax, but inside the provider. Using Flutter's asset system, this would be:
final configProvider = FutureProvider<Configuration>((ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;
return Configuration.fromJson(content);
});
Then, the UI can listen to configurations like so:
Widget build(BuildContext context, WidgetRef ref) {
AsyncValue<Configuration> config = ref.watch(configProvider);
return config.when(
loading: () => const CircularProgressIndicator(),
error: (err, stack) => Text('Error: $err'),
data: (config) {
return Text(config.host);
},
);
}
This will automatically rebuild the UI when the Future completes.
As you can see, listening to a FutureProvider inside a widget returns an AsyncValue – which allows handling the error/loading states.
See also:
- AsyncNotifierProvider, similar to FutureProvider but also enables modifying the state from the UI.
- Provider, a provider that synchronously creates a value
- StreamProvider, a provider that asynchronously exposes a value that can change over time.
- FutureProvider.family, to create a FutureProvider from external parameters
- FutureProvider.autoDispose, to destroy the state of a FutureProvider when no longer needed.
Implementation
FutureProvider(
this._createFn, {
super.name,
super.dependencies,
@Deprecated('Will be removed in 3.0.0') super.from,
@Deprecated('Will be removed in 3.0.0') super.argument,
@Deprecated('Will be removed in 3.0.0') super.debugGetCreateSourceHash,
}) : super(
allTransitiveDependencies:
computeAllTransitiveDependencies(dependencies),
);