overrideWithValue method
Overrides the behavior of a provider with a value.
Some common use-cases are:
- testing, by replacing a service with a fake implementation, or to reach a very specific state easily.
- multiple environments, by changing the implementation of a class based on the platform or other parameters.
This function should be used in combination with ProviderScope.overrides
or ProviderContainer.overrides
:
final myService = Provider((ref) => MyService());
runApp(
ProviderScope(
overrides: [
myService.overrideWithProvider(
// Replace the implementation of MyService with a fake implementation
Provider((ref) => MyFakeService())
),
],
child: MyApp(),
),
);
Implementation
@override
Override overrideWithValue(AsyncValue<T> value) {
return ProviderOverride(
ValueProvider<Stream<T>, AsyncValue<T>>((ref) {
AsyncValue<T>? lastValue;
final controller = StreamController<T>();
ref.onDispose(controller.close);
ref.onChange = (newValue) {
newValue.when(
data: controller.add,
loading: () {
if (lastValue != null && lastValue is! AsyncLoading) {
ref.markMustRecomputeState();
}
},
error: controller.addError,
);
lastValue = newValue;
};
ref.onChange!(value);
return controller.stream.asBroadcastStream();
}, value),
this,
);
}