在以下情况下,Flutter的重建/重新绘制如何工作:
- 在Stateful widget中创建Stateless widget。
- 在Stateless widget中创建Stateful widget。
当Stateful widget状态发生更改时,Stateless widget是否每次都会渲染?
Stateless widget中可以更改Stateful widget吗?这会对Stateless widget产生什么影响?
在以下情况下,Flutter的重建/重新绘制如何工作:
当Stateful widget状态发生更改时,Stateless widget是否每次都会渲染?
Stateless widget中可以更改Stateful widget吗?这会对Stateless widget产生什么影响?
首先,以下是来自Flutter文档的无状态和有状态的区别:
一个无状态的widget永远不会改变。Icon、IconButton和Text都是无状态的widget的例子。无状态的widget是从StatelessWidget子类化而来。
有状态的widget是动态的:例如,它可以根据用户交互触发的事件或接收到的数据来改变外观。
对于第一种情况,“在有状态的widget内创建无状态的widget”。
当我们更新有状态的widget的状态时,它会重新运行其构建函数。如果一个无状态的widget是构建函数的一部分,Flutter将检查它的输入数据是否已更改。如果没有更改,则返回相同的widget实例;如果已更改,则创建另一个无状态的widget实例并丢弃以前的实例。
以下是来自这篇文章的上述场景的示意图:
对于第二种情况,“在无状态的widget内创建有状态的widget”。
让我们先尝试以小部件树的形式进行说明,以便更好地可视化正在发生的事情。
Stateless (1)
/ \
/ \
(2) Stateful Stateless (3)
如果我们更新有状态的小部件(2)的状态,(1)和(3)都不会受到影响,但有状态的小部件中的build函数将再次被调用。
如果来自父级的输入(1)发生更改,则(1)和(2)将重新构建,并且flutter将检查(3)是否具有输入数据更改,如果没有,则返回相同的实例。
希望这回答了你的问题并让你更好地理解flutter如何呈现其UI。
注意:这是我对flutter处理有状态和无状态小部件重建方式的理解,如果有任何不正确的地方,请随时纠正。