Flutter核心技术与实战 10 | Widget中的State到底是什么?

299 阅读1分钟

StatefulWidget 应对有交互、需要动态变化视觉效果的场景,而 StatelessWidget 则用于处理静态的、无状态的视图展示。

UI 编程范式

Flutter 中,如何调整一个控件(Widget)的展示样式,即 UI 编程范式。

原生系统(Android、iOS)或原生 JavaScript话,视图开发是命令式的,需要精确地告诉操作系统或浏览器用何种方式去做事情。比如,如果我们想要变更界面的某个文案,则需要找到具体的文本控件并调用它的控件方法命令,才能完成文字变更。

与此不同的是,Flutter 的视图开发是声明式的,其核心设计思想就是将视图和数据分离,这与 React 的设计思路完全一致。和Android的MVVM类似,就是用数据驱动视图的变化。

在 Flutter 中,Widget 采用由父到子、自顶向下的方式进行构建,父 Widget 控制着子 Widget 的显示样式,其样式配置由父 Widget 在构建时提供。

StatelessWidget和StatefulWidget

Widget 是不可变的,更新则意味着销毁 + 重建(build)。StatelessWidget 是静态的,一旦创建则无需更新;而对于 StatefulWidget 来说,在 State 类中调用 setState 方法更新数据,会触发视图的销毁和重建,也将间接地触发其每个子 Widget 的销毁和重建。

优化方案

基于上面的描述,我们知道,StatelessWidget在性能上优于StatefulWidget,那么在构建一个复杂的Widget时,可以考虑组件化的方案,即将变化的和不变化的Widget单独处理,再封装在StatelessWidget中,这样只改变某个子组件,而不更改整个Widget。因为子Widget的setState并不会影响整个Widget。