Flutter Element概念简明分析

 更新时间:2023年04月13日 09:30:54   作者:iOS_Apple  
Flutter 中 Element 作用的是作为中枢来管理和调度Widget和RenderObject,这里我们主要说一下RenderObjectWidget 来主要说一下Element 的生命周期,这里我删除了一些assert 的方法,方便查看

一 Element 概念

这个玩意的概念。到底是什么 ?

官方解释是在树中特定位置的实例。

二 继承关系

element 有 ComponentElement 和 RenderObjectElement 之分

ComponentElement

class StatelessElement extends ComponentElement

class StatefulElement extends ComponentElement

三 生命周期

1 framework 通过在将要被用来作为Element的初始配置的widget 上调用其createElement 方法来创建一个element

2 framework 通过调用mount 方法 将一个新创建的element 加入树中给定的父节点的插槽下面。

mount 方法负责注入任何child widgets,并且会在有需要·的时候,会调用attachRenderObject

将关联的render objects 添加到渲染树中 render tree 中。到这一步的时候,element 会进入active 状态,并且会显示在屏幕上方。

四 方法分析

Element 这个抽象类中有一个方法 叫做 mount 方法 。

  /// Add this element to the tree in the given slot of the given parent.
  ///
  /// The framework calls this function when a newly created element is added to
  /// the tree for the first time. Use this method to initialize state that
  /// depends on having a parent. State that is independent of the parent can
  /// more easily be initialized in the constructor.
  ///
  /// This method transitions the element from the "initial" lifecycle state to
  /// the "active" lifecycle state.
  ///
  /// Subclasses that override this method are likely to want to also override
  /// [update], [visitChildren], [RenderObjectElement.insertRenderObjectChild],
  /// [RenderObjectElement.moveRenderObjectChild], and
  /// [RenderObjectElement.removeRenderObjectChild].
  ///
  /// Implementations of this method should start with a call to the inherited
  /// method, as in `super.mount(parent, newSlot)`.
  @mustCallSuper
  void mount(Element? parent, Object? newSlot) {
    assert(_lifecycleState == _ElementLifecycle.initial);
    assert(widget != null);
    assert(_parent == null);
    assert(
        parent == null || parent._lifecycleState == _ElementLifecycle.active);
    assert(slot == null);
    _parent = parent;
    _slot = newSlot;
    _lifecycleState = _ElementLifecycle.active;
    _depth = _parent != null ? _parent!.depth + 1 : 1;
    if (parent != null) {
      // Only assign ownership if the parent is non-null. If parent is null
      // (the root node), the owner should have already been assigned.
      // See RootRenderObjectElement.assignOwner().
      _owner = parent.owner;
    }
    assert(owner != null);
    final Key? key = widget.key;
    if (key is GlobalKey) {
      owner!._registerGlobalKey(key, this);
    }
    _updateInheritance();
    attachNotificationTree();
  }

renderObjectElement 的mount 方法

其主要作用 将element相关联的renderObject插入到渲染树中,插入到渲染树后的element就处于“active”状态,处于“active”状态后就可以显示在屏幕上了。

此处可以看出来,RenderObject? _renderObject; element 是持有renderObject 的引用的

  @override
  void mount(Element? parent, Object? newSlot) {
    super.mount(parent, newSlot);
    assert(() {
      _debugDoingBuild = true;
      return true;
    }());
    _renderObject = (widget as RenderObjectWidget).createRenderObject(this);
    assert(!_renderObject!.debugDisposed!);
    assert(() {
      _debugDoingBuild = false;
      return true;
    }());
    assert(() {
      _debugUpdateRenderObjectOwner();
      return true;
    }());
    assert(_slot == newSlot);
    attachRenderObject(newSlot);
    _dirty = false;
  }

到此这篇关于Flutter Element概念简明分析的文章就介绍到这了,更多相关Flutter Element内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android编写简易文件管理模块

    Android编写简易文件管理模块

    这篇文章主要为大家详细介绍了Android编写简易文件管理模块的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Android有效获取状态栏(StatusBar)高度的方法

    Android有效获取状态栏(StatusBar)高度的方法

    这篇文章主要介绍了Android有效获取状态栏(StatusBar)高度的方法,涉及Android针对状态栏(StatusBar)属性操作的相关技巧,需要的朋友可以参考下
    2016-08-08
  • Android端TCP长连接的性能优化教程分享

    Android端TCP长连接的性能优化教程分享

    在开发过程中,我们经常会用到TCP/IP连接实现即时数据传输,下面这篇文章主要给大家介绍了关于Android端TCP长连接的性能优化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2018-03-03
  • android开机自动启动app的解决方法

    android开机自动启动app的解决方法

    这篇文章主要为大家详细介绍了android开机自动启动app的解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Jetpack Compose修饰符专项精讲

    Jetpack Compose修饰符专项精讲

    在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的UI框架,它可简化并加快Android上的界面开发,使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩
    2022-10-10
  • Android实现完整游戏循环的方法

    Android实现完整游戏循环的方法

    这篇文章主要介绍了Android实现完整游戏循环的方法,以实例代码形式较为详细的分析了Android游戏循环的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android 超详细SplashScreen入门教程

    Android 超详细SplashScreen入门教程

    Android 12正式版即将发布,有一个非常显著的视觉变化就是,Android 12强制给所有的App都增加了SplashScreen的功能。是的,即使你什么都不做,只要你的App安装到了Android 12手机上,都会自动拥有这个新功能
    2022-03-03
  • Android使用acoco统计代码行覆盖率介绍

    Android使用acoco统计代码行覆盖率介绍

    大家好,本篇文章主要讲的是Android使用acoco统计代码行覆盖率介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Android12四大组件之Activity生命周期变化详解

    Android12四大组件之Activity生命周期变化详解

    虽然说我们天天都在使用Activity,但是你真的对Activity的生命机制完全了解了吗?Activity的生命周期方法只有七个,但是其实那只是默认的情况。也就是说在其他情况下,Activity的生命周期可能不会是按照我们以前所知道的流程,本章着重讲解Activity的生命周期变化
    2022-07-07
  • Android布局性能优化之按需加载View

    Android布局性能优化之按需加载View

    这篇文章主要介绍了Android布局性能优化之按需加载View的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09

最新评论