updateOverrides method

void updateOverrides(
  1. List<Override> overrides
)

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',
  );
}