ProviderContainer constructor

ProviderContainer({
  1. ProviderContainer? parent,
  2. List<Override> overrides = const [],
  3. List<ProviderObserver>? observers,
})

An object that stores the state of the providers and allows overriding the behavior of a specific provider.

If you are using Flutter, you do not need to care about this object (outside of testing), as it is implicitly created for you by ProviderScope.

Implementation

ProviderContainer({
  ProviderContainer? parent,
  List<Override> overrides = const [],
  List<ProviderObserver>? observers,
})  : _parent = parent,
      _localObservers = observers,
      _root = parent?._root ?? parent {
  assert(() {
    _debugId = '${_debugNextId++}';
    RiverpodBinding.debugInstance.containers = {
      ...RiverpodBinding.debugInstance.containers,
      _debugId: this,
    };
    return true;
  }(), '');

  if (parent != null) {
    if (observers != null) {
      throw UnsupportedError(
        'Cannot specify observers on a non-root ProviderContainer/ProviderScope',
      );
    }
    for (final override in overrides) {
      if (override is! ProviderOverride ||
          override._origin is! ScopedProvider) {
        throw UnsupportedError(
          'Cannot override providers on a non-root ProviderContainer/ProviderScope',
        );
      }
    }

    parent._children.add(this);

    _overrideForProvider.addEntries(parent._overrideForProvider.entries
        .where((e) => e.key is ScopedProvider));
  }

  for (final override in overrides) {
    if (override is ProviderOverride) {
      _overrideForProvider[override._origin] = override._provider;
    } else if (override is FamilyOverride) {
      _overrideForFamily[override._family] = override;
    }
  }
}