Stateful Widget 和 Stateless Widget 之间的互相嵌套

10

在以下情况下,Flutter的重建/重新绘制如何工作:

  • 在Stateful widget中创建Stateless widget。
  • 在Stateless widget中创建Stateful widget。

当Stateful widget状态发生更改时,Stateless widget是否每次都会渲染?

Stateless widget中可以更改Stateful widget吗?这会对Stateless widget产生什么影响?

1个回答

25

首先,以下是来自Flutter文档的无状态和有状态的区别:

一个无状态的widget永远不会改变。Icon、IconButton和Text都是无状态的widget的例子。无状态的widget是从StatelessWidget子类化而来。

有状态的widget是动态的:例如,它可以根据用户交互触发的事件或接收到的数据来改变外观。

对于第一种情况,“在有状态的widget内创建无状态的widget”。

当我们更新有状态的widget的状态时,它会重新运行其构建函数。如果一个无状态的widget是构建函数的一部分,Flutter将检查它的输入数据是否已更改。如果没有更改,则返回相同的widget实例;如果已更改,则创建另一个无状态的widget实例并丢弃以前的实例。

以下是来自这篇文章的上述场景的示意图:

enter image description here

对于第二种情况,“在无状态的widget内创建有状态的widget”。

让我们先尝试以小部件树的形式进行说明,以便更好地可视化正在发生的事情。

              Stateless (1)
               /      \
              /        \
      (2) Stateful   Stateless (3)

如果我们更新有状态的小部件(2)的状态,(1)和(3)都不会受到影响,但有状态的小部件中的build函数将再次被调用。

如果来自父级的输入(1)发生更改,则(1)和(2)将重新构建,并且flutter将检查(3)是否具有输入数据更改,如果没有,则返回相同的实例。

希望这回答了你的问题并让你更好地理解flutter如何呈现其UI。

注意:这是我对flutter处理有状态和无状态小部件重建方式的理解,如果有任何不正确的地方,请随时纠正。


太棒了!它回答了我两个问题。链接的文章也很好地解释了无状态和有状态之间的关系。12小时内奖励赏金。 - genericUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接