我想知道如果定义一个StatelessWidget但从其build方法返回一个有状态的Widget会发生什么?我已经尝试过了,似乎一切都正常,但是我只想知道幕后发生的事情,这样我就可以确保在将其交付生产时不会破裂。具体来说:
1)我想知道是否对父StatelessWidget的每次重建都会触发对它返回的StatefulWidget的重建?如果是这样,是说我正在有效地返回一个StatelessWidget吗?
2)我想知道父级StatelessWidget是否仍会在小部件树中,因为它只是一个包装并且没有任何可视元素要呈现?
3)如果我想给子StatefulWidget一个密钥,是否应该给父StatelessWidget相同的密钥?或者,我应该将密钥放在父StatelessWidget上吗?
答案 0 :(得分:1)
无状态和有状态的混合是非常非常非常普遍的用例。
答案相对简单:没有什么特别的事情。
无状态+有状态与无状态* 2或有状态* 2相同。无需更改行为,也不需要额外的代码。
我想知道是否对父StatelessWidget的每次重建都会触发对它返回的StatefulWidget的重建?如果是这样,是说我正在有效地返回一个StatelessWidget吗?
不。每个小部件都是独立的,并且可以在不强制其他小部件重新构建的情况下进行重建。
子项重建不会使父项重建。同样,父母重建不一定会强迫孩子重建。
我想知道父级StatelessWidget是否仍会在小部件树中,因为它只是一个包装并且没有任何可视元素要呈现?
是的,一个StatelessWidget仍在树中。
不,它不是“只是包装纸”。 StatelessWidget可以使用InheritedWidgets并覆盖==
。
这些会导致小部件独立于其他小部件进行重建。因此,此小部件必须在树中说。
它甚至有一个setState
等价物;它只是不公开。
如果我想给子StatefulWidget一个密钥,是否应该给父StatelessWidget相同的密钥?或者,我应该将密钥放在父StatelessWidget上吗?
不。不需要。
如果键位于小部件上,则将影响其整个子树。因此也无需将其放在后代上。
实际上,您不能,取决于密钥。例如,GlobalKey要求唯一。