updateOverrides method
Updates the list of provider overrides.
If you are using flutter, this is done implicitly for you by ProviderScope
.
Updating a overrideWithValue
with a different value
will cause the listeners to rebuild.
It is not possible, to remove or add new overrides, only update existing ones.
Implementation
void updateOverrides(List<Override> overrides) {
if (_disposed) {
throw StateError(
'Called updateOverrides on a ProviderContainer that was already disposed',
);
}
List<Override>? unusedOverrides;
assert(() {
unusedOverrides = [...overrides];
return true;
}(), '');
for (final override in overrides) {
if (override is ProviderOverride) {
assert(
_overrideForProvider[override._origin].runtimeType ==
override._provider.runtimeType,
'Replaced the override of type ${_overrideForProvider[override._origin].runtimeType} '
'with an override of type ${override._provider.runtimeType}, which is different.\n'
'Changing the kind of override or reordering overrides is not supported.',
);
final previousOverride = _overrideForProvider[override._origin];
_overrideForProvider[override._origin] = override._provider;
if (override._origin is ScopedProvider) {
for (final child in _children) {
if (override._provider is! ValueProvider ||
(override._provider as ValueProvider)._value !=
(previousOverride! as ValueProvider)._value) {
if (child._overrideForProvider[override._origin] ==
previousOverride) {
child.updateOverrides([override]);
}
}
}
}
assert(() {
unusedOverrides!.remove(override);
return true;
}(), '');
// _stateReaders[override._origin] cannot be null for overridden providers.
final element = _stateReaders[override._origin];
if (element == null) {
continue;
}
_runUnaryGuarded(element.update, override._provider);
} else if (override is FamilyOverride) {
assert(() {
unusedOverrides!.remove(override);
return true;
}(), '');
_overrideForFamily[override._family] = override;
}
}
assert(
unusedOverrides!.isEmpty,
'Updated the list of overrides with providers that were not overriden before',
);
}