js
复制代码
1 Element的属性 _inheritedElements 的含义以及创建时机 _inheritedElements 类型是PersistentHashMap<Type, InheritedElement>?。存储的是Element树上的所有InheritedElement
2 _inheritedElements 的创建时机在_updateInheritance中
2.1 Element的默认实现如下
void _updateInheritance() {
assert(_lifecycleState == _ElementLifecycle.active);
_inheritedElements = _parent?._inheritedElements;}
2.2 只有在InheritedElement重写了这个方法
void _updateInheritance() {
assert(_lifecycleState == _ElementLifecycle.active);
final PersistentHashMap<Type, InheritedElement> incomingWidgets =
_parent?._inheritedElements ?? const PersistentHashMap<Type, InheritedElement>.empty();
_inheritedElements = incomingWidgets.put(widget.runtimeType, this);
}
2.3 从上面的代码 我们可以得出如下结论
2.3.1 在Element树上,只有遇到InheritedElement才会主动创建
_inheritedElements,之后所有的child 通过_parent?._inheritedElements 一级一级的传递。
2.3.2 当Element树创建的时候如果出现类型相同的InheritedElement,那么后出现的
InheritedElement再执行_updateInheritance方法的时候,会把自己放入
_inheritedElements,因为widget.runtimeType两个相同的InheritedElement获取的是一样
的,所以相当于说是替换了原来_inheritedElements里面存的旧的跟自己类型相同的InheritedElement。
也就是说_inheritedElements里面存储的是Element树上的所有的InheritedElement,如果有重复的,那存储的就是离自己最近的那一个InheritedElement。