if (provider.from != null) {
// reading a family
final familyOverrideRef = _overrideForFamily[provider.from];
if (familyOverrideRef != null) {
// A family was overridden, so we implicitly mount the readers
if (familyOverrideRef.container._stateReaders.containsKey(provider)) {
return familyOverrideRef.container._stateReaders[provider]!;
}
void setupOverride({
required ProviderBase<Object?> origin,
required ProviderBase<Object?> override,
}) {
assert(
origin == override || override.dependencies == null,
'A provider override cannot specify `dependencies`',
);
// setupOverride may be called multiple times on different providers
// of the same family (provider vs provider.modifier), so we use ??=
// to initialize the providers only once
familyOverrideRef.container._stateReaders[origin] ??= _StateReader(
origin: origin,
override: override,
container: familyOverrideRef.container,
isDynamicallyCreated: true,
);
}
final providerOverride =
familyOverrideRef.override.getProviderOverride(provider);
setupOverride(origin: provider, override: providerOverride);
// if setupOverride overrode the provider, it was already initialized
// in the code above. Otherwise we initialize it as if it was not overridden
return familyOverrideRef.container._stateReaders[provider] ??
_StateReader(
origin: provider,
override: provider,
container: familyOverrideRef.container,
isDynamicallyCreated: true,
);
}
}
3.2 对于普通的 Provider
dart复制代码
final root = _root;
if (root != null) {
// Provider可能依赖了其他的Provider,找出依赖
final dependencies = provider.from?.allTransitiveDependencies ??
provider.allTransitiveDependencies;
// 找到它们所在的ProviderContainer
final containerForDependencyOverride = dependencies
?.map((dep) {
final reader = _stateReaders[dep];
if (reader != null) {
return reader.container;
}
final familyOverride = _overrideForFamily[dep];
return familyOverride?.container;
})
.where((container) => container != null)
.toList();
// 如果有,找出层级最深的那个container
if (containerForDependencyOverride != null &&
containerForDependencyOverride.isNotEmpty) {
final deepestOverrideContainer = containerForDependencyOverride
.fold<ProviderContainer>(root, (previous, container) {
if (container!.depth > previous.depth) {
return container;
}
return previous;
});
// 新创建的ProviderElementBase应该存放到依赖层级最深的ProviderContainer中,放大作用域
return deepestOverrideContainer._stateReaders.putIfAbsent(provider,
() {
return _StateReader(
origin: provider,
override: provider,
container: deepestOverrideContainer,
isDynamicallyCreated: true,
);
});
}
} // end if (root != null)
// 到这里,如果这个provider显式依赖了其他的provider,那么它对应的_StateReader已经被创建并返回了
// 否则,这个provider没有依赖任何其他的provider。在根container中寻找
if (_root?._stateReaders.containsKey(provider) ?? false) {
return _root!._stateReaders[provider]!;
}
// 最顶层ProviderContainer中也没有这个provider对应的element。创建并将它放到最顶层中
final reader = _StateReader(
origin: provider,
// If a provider did not have an associated StateReader then it is
// guaranteed to not be overridden
override: provider,
// 当自己为根节点时,_root才为空
container: _root ?? this,
isDynamicallyCreated: true,
);
if (_root != null) {
_root!._stateReaders[provider] = reader;
}
return reader;
}
void _performRefresh() {
for (var i = 0; i < _stateToRefresh.length; i++) {
final element = _stateToRefresh[i];
if (element.hasListeners) element.flush();
}
}
依次销毁。如果某个ProviderElement被保活/仍有监听者,跳过销毁。
dart复制代码
void _performDispose() {
for (var i = 0; i < _stateToDispose.length; i++) {
final element = _stateToDispose[i];
final links = element._keepAliveLinks;
// 被保活/有监听者,跳过销毁
if (element.maintainState ||
(links != null && links.isNotEmpty) ||
element.hasListeners ||
element._container._disposed) {
continue;
}
element._container._disposeProvider(element._origin);
}
}