Flutter:StatelessWidget可以从其build方法返回StatefulWidget吗?

时间:2019-08-18 08:39:05

标签: flutter dart

我想知道如果定义一个StatelessWidget但从其build方法返回一个有状态的Widget会发生什么?我已经尝试过了,似乎一切都正常,但是我只想知道幕后发生的事情,这样我就可以确保在将其交付生产时不会破裂。具体来说:

1)我想知道是否对父StatelessWidget的每次重建都会触发对它返回的StatefulWidget的重建?如果是这样,是说我正在有效地返回一个StatelessWidget吗?

2)我想知道父级StatelessWidget是否仍会在小部件树中,因为它只是一个包装并且没有任何可视元素要呈现?

3)如果我想给子StatefulWidget一个密钥,是否应该给父StatelessWidget相同的密钥?或者,我应该将密钥放在父StatelessWidget上吗?

1 个答案:

答案 0 :(得分:1)

无状态和有状态的混合是非常非常非常普遍的用例。

答案相对简单:没有什么特别的事情。

无状态+有状态与无状态* 2或有状态* 2相同。无需更改行为,也不需要额外的代码。

  

我想知道是否对父StatelessWidget的每次重建都会触发对它返回的StatefulWidget的重建?如果是这样,是说我正在有效地返回一个StatelessWidget吗?

不。每个小部件都是独立的,并且可以在不强制其他小部件重新构建的情况下进行重建。

子项重建不会使父项重建。同样,父母重建不一定会强迫孩子重建。

  

我想知道父级StatelessWidget是否仍会在小部件树中,因为它只是一个包装并且没有任何可视元素要呈现?

是的,一个StatelessWidget仍在树中。

不,它不是“只是包装纸”。 StatelessWidget可以使用InheritedWidgets并覆盖==

这些会导致小部件独立于其他小部件进行重建。因此,此小部件必须在树中说。

它甚至有一个setState等价物;它只是不公开。

  

如果我想给子StatefulWidget一个密钥,是否应该给父StatelessWidget相同的密钥?或者,我应该将密钥放在父StatelessWidget上吗?

不。不需要。

如果键位于小部件上,则将影响其整个子树。因此也无需将其放在后代上。

实际上,您不能,取决于密钥。例如,GlobalKey要求唯一。