当前位置: 首页 > news >正文

网站建设流程与步骤九江公司网站建设

网站建设流程与步骤,九江公司网站建设,推荐小蚁人网站建设,四川住房和城乡建设厅进不去网站一 Widget Element RenderObject 之间的关系 1 Widget 在Flutter 中,万物皆是Widget,无论是可见的还是功能型的。一切都是Widget. 官方文档中说的Widget 使用配置和状态来描述View 界面应该长什么样子。 它不仅可以表示UI元素,也可以表示一些功能性的…

一  Widget Element RenderObject 之间的关系

1   Widget

在Flutter 中,万物皆是Widget,无论是可见的还是功能型的。一切都是Widget.

官方文档中说的Widget 使用配置和状态来描述View 界面应该长什么样子。

它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector、用于APP主题数据传递的Theme、布局元素等等

两个重要的方法

一个是通过 createElement 来创建 Element 对象的,

一个是根据 key 来决定更新行为的 canUpdate 方法。

在这个方法中会对比runtimeType (也就是widget 的类型)和 key 是否相同

@immutable
abstract class Widget extends DiagnosticableTree {/// Initializes [key] for subclasses.const Widget({this.key});final Key? key;@protected@factoryElement createElement();/// A short, textual description of this widget.@overrideString toStringShort() {final String type = objectRuntimeType(this, 'Widget');return key == null ? type : '$type-$key';}@overridevoid debugFillProperties(DiagnosticPropertiesBuilder properties) {super.debugFillProperties(properties);properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;}@override@nonVirtualbool operator ==(Object other) => super == other;@override@nonVirtualint get hashCode => super.hashCode;static bool canUpdate(Widget oldWidget, Widget newWidget) {return oldWidget.runtimeType == newWidget.runtimeType &&oldWidget.key == newWidget.key;}// Return a numeric encoding of the specific `Widget` concrete subtype.// This is used in `Element.updateChild` to determine if a hot reload modified the// superclass of a mounted element's configuration. The encoding of each `Widget`// must match the corresponding `Element` encoding in `Element._debugConcreteSubtype`.static int _debugConcreteSubtype(Widget widget) {return widget is StatefulWidget? 1: widget is StatelessWidget? 2: 0;}
}

2   Element

Element 就是一个Widget 的实例,在树中详细的位置。

An instantiation of a Widget at a particular location in the tree

3 RenderObject

渲染树上的一个对象。负责具体布局和绘制这些事情。

4 结合图说一下其三者的关系

从创建到渲染的流程 :

根据Widget 生成Element,然后创建响应的RenderObject并且关联到Element.renderObject 属性。最后再通过RenderObject 来完成布局和绘制。

依赖关系:

Element 树根据Widget 树生成,而渲染树又依赖于widget 树。

5 一些小问题?

5.1  widget 和 element 是一一对应的吗 ? 为什么 ?

答:是一一对应的。

因为 abstract class Widget ,本身是一个抽象类,这个抽象类中有一个抽象方法叫做createElement(),子类必须实现这个抽象方法,所以是一一对应的。

5.2 widget 和 renderObject 是一一对应的吗 ? 为什么 ?

答:不是的

因为只有这个widget 继承自RenderObjectWidget 的时候,才会有对应的renderObject
像类似 Padding , Row,SizedBox,Center 这种组件继承自RenderObjectWidget的组件会有一一对应的关系


//class Padding extends SingleChildRenderObjectWidget// Padding();// class Flex extends MultiChildRenderObjectWidget// Row()

5.3 BuildContext 是什么 ?

答:是Element,不管是StatefulWidget 还是StatelessWidget 都会重写父类的build 方法,

build 方法传入的一个参数叫做BuildContext, 我们拿StatelessWidget来说,其本身创建一个StatelessElement,而在这个Element内部重写StatelessElement父类的build方法,而在这个build方法内部会调用_widget.build 方法,并且把this传递进去。那么这个this 就是element 。

/// An [Element] that uses a [StatelessWidget] as its configuration.
class StatelessElement extends ComponentElement {/// Creates an element that uses the given widget as its configuration.StatelessElement(StatelessWidget super.widget);@overrideWidget build() => (widget as StatelessWidget).build(this);@overridevoid update(StatelessWidget newWidget) {super.update(newWidget);assert(widget == newWidget);_dirty = true;rebuild();}
}

5.4 Widget 频繁更改创建是否会影响性能?复用和更新机制是什么样的?

不会影响性能,因为只是一些配置信息,没有有布局渲染到页面上去。中间层Element 会通过widget 的runtimeType 和 Key 来对比是否进行更新操作。

5.5 Build 方法会在什么时候调用 ?

Element 创建完毕之后会调用mount 方法,对于非渲染的ComponentElement 来说,mount主要执行的是Widget 中的build 方法。在StatelessElement 中直接使用的是 widget.build(this),

而在StatefullWidget 方法中,通过的是state.build(this)。在StatefulElement 这个类中,

初始化列表的给state 进行了赋值操作。通过widget调用createState方法之后,把state赋值给自己的_state 属性。

StatefulElement(StatefulWidget widget)

: _state = widget.createState(),

5.6 createState 方法什么时候调用?

答:创建Element 的时候。

Flutter 会在遍历 Widget 树时调用 Widget 里面的 createElement 方法去生成对应节点的 Element 对象,同时执行 StatefulWidget 里面的 createState 方法创建 state,并且赋值给 Element 里的 _state 属性,当前 widget 也同时赋值给了 state 里的_widget,state 里面有个 widget 的get 方法可以获取到 _widget 对象。
 

http://www.yayakq.cn/news/903587/

相关文章:

  • 长沙做网站开发价格多少城市建设与管理网站
  • 哪个公司做网站好苏州如何制作电脑公司网站
  • 安徽省六安市城乡建设厅网站物流公司名称大全
  • 建设企业网站的流程seo的收费标准
  • 城建网站论坛 建设虚拟网站php专业型
  • 寿宁县建设局网站网上接单
  • 免费做微信链接的网站logo的专业设计
  • 广东网站建设方便苏州网站建设建网站
  • 建网站要定制还是第三方系统wordpress内置编辑器
  • 国内漂亮网站欣赏物业管理系统需求分析
  • 网站建设直播雅布设计作品
  • 推广企业网站最主要的方式ios软件开发用什么工具
  • 网站建设与推广培训学校怎么优化网站性能
  • 免费的网站登录模板下载施工企业筹备建立
  • 百度推广 做网站wordpress 防攻击插件
  • 网站维护与更新商业活动的网站建设
  • 广西网站建设服务好流量对网站的作用
  • 做网站江西刚做淘客没有网站
  • 网站开发收费标准文档网络营销推广方案书
  • 做果蔬零售的网站枣阳城乡建设局网站
  • directadmin备份网站产品宣传网站开发
  • 笑话网站模板杭州有哪些大数据知名企业
  • 做o2o平台网站需要多少钱公司网站设计案例
  • 贵州省住房和城乡建设厅网站打不开电子商务网站设计是什么
  • 什么 电子商务网站建设与管wordpress 鼠标悬停
  • 网站后台的关键词网络游戏制作软件
  • 何苦做游戏网站wordpress 多语言版
  • 静宁门户网站谢晶晶的赣州没有网页制作
  • 沛县建设局网站营销型网站策划公司
  • 商务卫士包括网站建设莱芜网站建设怎么样