Flutter
是Google
开发的构建高性能UI界面的框架。在Flutter
中一切都是Widget
渲染组成
Widget
Widget效率英文翻译
是对用户界面的一种不可变
的描述。由于Widget
是不可变的,当App进行交互的时候,我们的界面要进行变动,是怎么做到的呢?
实际上,Flutter
由3种树Widget Tre枸杞e
、E宫颈癌lement Tree
和RenderObject Tree
。Flutter通过结合这三颗树,更加高效的渲染UI界面elementary。
使用Widget
,可以声明我们想要的UI样式,配置样式属性信息。可以说是Widget
是Element
的一个配置描述。Widget
会被映射为一个Element
对象。
Widget
它们本身没有可elementary翻译变的状态,如果我们想让Widget
有可变的状态,可以使用StatefulWidget
,StatefulWidget
会创建一个State
对application象,并将State
对象插入到Element
树中。
同一个Wi效率是什么意思dget
可能会被多次移除和添加,同样的,同一个龚俊Element
对象也会被多次在Element树中移除和添加。
Element
Element
是用来描述Widget
在树中位置的,记录了其上google谷歌搜索主页下级关系。它是可变的,用来管理UI的更新和变化。我们可以认为Element
是来管理Widget
的生命周期的。实际上Widget
是没有生命周期的,效率英文翻译Element
有生elements中文翻译命周期的,Element
的生龚俊命周期也代表了WidgGoogleet
对象是否还在树中。
RenderObject
RenderObject
负责设置大小,布局和绘制UI的,Flutter
通过参照Render tree
进行UI绘制。
通过以上我们知道由Widget负责配置信息,Element负责生命周期Element,RenderObject负责绘制
。那么Flutter
渲染Wigoogle服务框架dget
也分为3部分:设置配置信息,控制生命周期和绘制
。
- 1,通过设置
Widget
的properties
和method
,来配置UI的信息。 - 2,通过
Element
来控制UI对象的生命周期,并且管理Element对象效率的父子关系。 - 3,公司让员工下班发手机电量截图通过
RenderObject
,每个componet都有paint方法,通过约束和大小确定位置关系,并开始绘制
Source St工商银行ep By Step
3颗树的创appointment建流程
我们来看如下代码:
Widget build(BuildContext context) {
return Center(
child: RichText(
text: const TextSpan(text: "Rich Text"),
),
);
}
当创建RichText
Widget的时候,
1,会创建 MultiChildRenderObjectElement
对象。
class RichText extends MultiChildRenderObjectWidget {
//....
}
abstract class MultiChildRenderObjectWidget extends RenderObjectWidget {
....
@override
MultiChildRenderObjectElement createElement() => MultiChildRenderObjectElement(this);
}
2,第二步,在mount
方法中,创建RenderOgoogleplaybject
对象。
abstract class RenderObjectElement extends Element {
......
@override
void mount(Element? parent, Object? newSlot) {
super.mount(parent, newSlot);
......
_renderObject = widget.createRenderObject(this);
......
attachRenderObject(newSlot);
_dirty = false;
}
2.1,将Widget
中的配置信息(属性),赋值给RenderObject
对象。
MultiChildRenderObjectWidget:
@override
RenderParagraph createRenderObject(BuildContext context) {
assert(textDirection != null || debugCheckHasDirectionality(context));
return RenderParagraph(text,
textAlign: textAlign,
textDirection: textDirection ?? Directionality.of(context),
softWrap: softWrap,
overflow: overflow,
textScaleFactor: textScaleFactor,
maxLines: maxLines,
strutStyle: strutStyle,
textWidthBasis: textWidthBasis,
textHeightBehavior: textHeightBehavior,
locale: locale ?? Localizations.maybeLocaleOf(context),
);
}
通过以上步骤,我们就得到了MultiChildRenderObjectWidget、MultiC效率符号hildRenderObjectElement 和 RenderParagraph
更新子部件
有时候我们需要根据不同的状态显示不同UI界面,这时候,就会去更新子部件,我们看如下代码
Widget build(BuildContext context) {
return Center(
child: RichText(
text: reverse
? const TextSpan(text: "Rich Text Two")
: const TextSpan(text: "Rich Text"),
),
);
}
当 reverse
值更改的时候,在appear下一次rebuild()
的过程中,将
TextSpan(text: "Rich Text Two")
加入到Widget
树,将原来的TextSpan
从效率是什么意思Widget
树中移除,与相同位置的Widget
进行比较,通过canUpdate
方法判断是否可以更新
Widget:
static bool canUpdate(Widget oldWidget, Widget newWidget) {
return oldWidget.runtimeType == newWidget.runtimeType
&& oldWidget.key == newWidget.key;
}
两个TextSpaelement滑板n
具有相同的runtimeType
,且他俩的key
值都为null
,返回Yes
。
然后执行 widget.updateRenderObject(this, renderObject);
更新RenderObject信息。
Widget:
@override
void updateRenderObject(BuildContext context, RenderParagraph renderObject) {
assert(textDirection != null || debugCheckHasDirectionality(context));
renderObject
..text = text
..textAlign = textAlign
..textDirection = textDirection ?? Directionality.of(context)
..softWrap = softWrap
..overflow = overflow
..textScaleFactor = textScaleFactor
..maxLines = maxLines
..strutStyle = strutStyle
..textWidthBasis = textWidthBasis
..textHeightBehavior = textHeightBehavior
..locale = locale ?? Localizations.maybeLocaleOf(context);
}
这approach样,RenderObject
树中的信息就会被更新。通过重用RenderObject
对象,就大大的提高了效率。毕竟,新建一个对象的开销非常大。
参考
Ho宫颈癌w Flutter Render Widgets