Element的属性 _inheritedElements 的含义以及创建时机

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。
相关推荐
程序员老刘10 小时前
跨平台开发地图 | 2026年10月
flutter·ai编程·客户端
林瞅瞅12 小时前
Flutter 开发环境从零搭建与调试记录
flutter
FungLeo16 小时前
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存
FungLeo17 小时前
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
穆梓兰煊1 天前
Flutter端云协同推理架构解析
flutter·github
FungLeo2 天前
成为全栈·Flutter App 篇·内置 WebView:网页历史、App 返回与外链安全
flutter·网络安全·移动开发·webview·路由管理·成为全栈
m0_738185822 天前
Flutter 鸿蒙化实战:volume_controller 适配 OpenHarmony,系统音量控制
flutter·华为·harmonyos·鸿蒙
FungLeo2 天前
成为全栈·Flutter App 篇·Flutter Markdown 阅读器:支持范围与渲染边界
flutter·markdown·dart·代码高亮·成为全栈·移动阅读
m0_738185822 天前
Flutter 鸿蒙化实战:webview_cookie_manager 适配 OpenHarmony,WebView Cookie 管理
flutter·华为·harmonyos·鸿蒙