Flutter深受React影响,采用了声明式UI的写法,那自然离不开 Virtual DOWM,扮演这个角色的正式Widget。在Flutter中可以说万物皆Widget。所以在Flutter的开发中Widget往往是层层嵌套的,那么Flutter是如何保证层级嵌套过深的性能呢?
Widget Tree上的Widget节点越多,通过Diff算法得到需要重建的部分就越精确、范围越小,而UI渲染的主要性能瓶颈就是Widget节点的重建
Dart语言的对象模型和GC模型对小对象的快读分配和回收做了优化,而Widget正式这种小对象
Flutter 自带了一套强大的基础 widgets,下面列出了一些常用的:
Text:Text widget 可以用来在应用内创建带样式的文本。
Row, Column:这两个 flex widgets 可以让你在水平(Row)和垂直(Column)方向创建灵活的布局。它是基于 web 的 flexbox 布局模型设计的。
Stack:Stack widget 不是线性(水平或垂直)定位的,而是按照绘制顺序将 widget 堆叠在一起。你可以用 Positionedwidget 作为 Stack 的子 widget,以相对于 Stack 的上,右,下,左来定位它们。Stack 是基于 Web 中的绝对位置布局模型设计的。
Container: Container widget 可以用来创建一个可见的矩形元素。Container 可以使用 BoxDecoration 来进行装饰,如背景,边框,或阴影等。Container 还可以设置外边距、内边距和尺寸的约束条件等。另外,Container 可以使用矩阵在三维空间进行转换。
StatelessWidget是一个不需要状态更改的widget - 它没有要管理的内部状态。
当您描述的用户界面部分不依赖于对象本身中的配置信息以及widget的BuildContext 时,无状态widget非常有用。
AboutDialog, CircleAvatar和 Text 都是StatelessWidget的子类。
StatefulWidget是可变状态的widget。 需要在State类中使用setState方法管理StatefulWidget的状态的改变。调用setState告诉Flutter框架,某个状态发生了变化,Flutter会重新运行build方法,以便应用程序可以应用最新状态。
状态是在构建widget时可以同步读取的信息可能会在widget的生命周期中发生变化。确保在状态改变时及时通知状态 变化是widget实现者的责任。当widget可以动态更改时,需要使用StatefulWidget。 例如, 通过键入表单或移动滑块来更改widget的状态. 或者, 它可以随时间变化 - 或者数据推送更新UI
Checkbox, Radio, Slider, InkWell, Form, 和 TextField 都是有状态的widget,也是StatefulWidget的子类。