0

我试图更好 地理解AnimatedPositioned.

从这篇 文章 (和随附的视频)我们知道,即使小部件对象本身保持不变,只是改变了小部件树中的位置,那么如果小部件是StatefulWidget.

好吧,在 的官方示例中AnimatedPositioned没有使用密钥。当selected被翻转时,setState触发对该build()方法的第二次调用。第二次调用不仅重新定位完全相同的StatelessWidget,而且还创建了一个全新的AnimatedPositioned对象。

Flutter 是如何知道这个小部件和以前的小部件是一样的(以便正确地为其设置动画)?它只是小部件树中的位置吗?但是我们可以有多个小部件,这是一个StatefulWidget.

为什么 StatefulWidget 有时不需要密钥?

4

1 回答 1

1

不总是在 a 中使用键的原因StatefulWidget是因为键擅长两件事*:当小部件在小部件树中更改位置时保持正确状态,以及能够在执行测试时直接查询特定小部件。

在 的官方示例中AnimatedPositioned,键是多余的,因为该示例中没有机制会导致小部件在小部件树中重新定位,因此状态没有丢失或错误分配的危险。由于这个例子不关心如何在测试上下文中引用小部件,这个用例也无关紧要。

理论上,您应该为您StatefulWidget的 s 分配唯一的键,以保证 Flutter 内部工作的安全性。然而,在实践中,为整个应用程序中的每个小部件分配一个唯一的键是多余的,你应该只在有理由这样做时才真正使用键。否则,它会成为那些可能涉及大量沉没时间和样板文件而几乎没有真正好处的做法之一。


*:在使用 DevTools 来查看应用程序的小部件树时,也可以诊断性地使用键。它们也可用于在查找特定小部件时遍历小部件树,但不鼓励这种使用,因为如果您需要从一个小部件获取信息到另一个小部件,则应使用状态管理工具。

于 2021-05-11T20:26:54.153 回答