-
Widget
实际上就是Element
的配置数据,Widget
树实际上是一个配置树,而真正的UI
渲染树是由Element
构成。不过,由于Element
是通过Widget
生成的,所以他们之间有对应关系,在大多数场景下,我们可以宽泛地认为Widget
树就是指UI
渲染树。 -
一个
Widget
对象可以对应多个Element
对象,因为同一份配置可以创建多个实例。
Widget
是一个抽象类,在 Dart
语言中,没有 interface
这个关键字,接口是通过抽象类来表示的。
先来看 Widget
的声明:
@immutable
abstract class Widget extends DiagnosticableTree {
const Widget({ this.key });
final Key key;
@protected
Element createElement();
@override
String toStringShort() {
return key == null ? ‘ r u n t i m e T y p e ′ : ′ runtimeType' : ' runtimeType′:′runtimeType-$key’;
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;
}
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
}
-
Widget
类继承了DiagnosticableTree
(诊断树),主要作用是提供调式信息。 -
属性
key
类似于React
或Vue
中的key
,主要的作用是决定是否在下一次build
时复用旧的widget
,决定条件在canUpdate()
中。 -
createElement()
:Flutter
在构建UI
树时,会先调用此方法生成对应节点的Element
对象。该方法是Flutter
隐式调用的,在开发过程我们很少会使用。 -
debugFillProperties()
:复写父类的方法,主要是设置诊断树的一些特性。 -
canUpdate()
:一个静态方法,它用于Widget
树重新build
时复用旧的widget
,具体的说,是否用新的widget
对象去更新旧UI
树上所对应的Element
。通过上面的源码发现,只有oldWidget
与newWidget
中的runtimeType
和key
都对应相等时,才会用newWidget
更新Element
对象的配置。
需要注意的是,我们一般不会直接继承 Widget
这个类,而是继承 StatelessWidget
或 StatefulWidget
来间接继承 Widget
。其中,前者表示无状态组件,后者表示有状态组件。
StatelessWidget
用于表示一个无状态的 Widget
,它继承自 Widget
类,重写了 createElement()
:
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】