面试题答案
一键面试- 调用
setState
方法:- 在有状态Widget的类中调用
setState
方法。setState
是State
类的方法。例如:
class MyStatefulWidget extends StatefulWidget { @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends State<MyStatefulWidget> { int count = 0; void increment() { setState(() { count++; }); } @override Widget build(BuildContext context) { return RaisedButton( onPressed: increment, child: Text('Count: $count'), ); } }
- 在有状态Widget的类中调用
State.setState
内部流程:setState
方法会调用_element.markNeedsBuild()
。这里的_element
是指与该State
对象关联的Element
对象。Element
类在Flutter的渲染树中起着重要作用,它将Widget和渲染对象联系起来。markNeedsBuild
方法会将该Element
标记为需要重建。
- 重建流程:
- 当Flutter的调度循环检测到有
Element
标记为需要重建时,会调用该Element
的build
方法。 - 对于有状态Widget对应的
Element
,其build
方法会调用State
对象的build
方法(也就是我们在代码中编写的build
方法)。 - 在
build
方法中,会重新构建Widget树,Flutter会根据新的状态(例如上述例子中count
增加后的状态)来生成新的Widget实例。 - 然后Flutter的渲染机制会对比新旧Widget树,通过
Diff算法
高效地更新实际渲染的部分,减少不必要的重绘,最终将更新后的界面显示出来。
- 当Flutter的调度循环检测到有
主要涉及的类:
State
:包含setState
方法,管理有状态Widget的状态。Element
:连接Widget和渲染对象,在状态更新时标记自身需要重建。
主要涉及的方法:
State.setState
:触发状态更新流程。Element.markNeedsBuild
:标记Element
需要重建。State.build
和Element.build
:用于重新构建Widget树。