Scaffold只是一个小部件,任何小部件的key属性都会在该小部件在树中移动时保留状态。对于the documentation for the key property: 控制一个小部件替换树中另一个小部件的方式。 如果两个小部件的runtimeType和key属性分别为operator==,则新小部件通过更新底层元素(即,通过使用新小部件调用Element.update)来替换旧小部件。否则,旧元素将从树中删除,新小部件将膨胀为元素,并将新元素插入树中。 此外,使用GlobalKey作为widget的键允许元素在树中移动(改变父元素)而不会丢失状态。当找到新的widget(其键和类型与同一位置的前一个widget不匹配),但在前一帧的树中的其他地方有一个具有相同全局键的widget时,则该widget的元素被移动到新的位置。 通常,作为另一个小部件的唯一子小部件不需要显式键。 来自Flutter团队的Here is a helpful video更深入地介绍了何时何地使用钥匙以及您可能使用的各种类型的钥匙,具体取决于情况。2:20的视频部分特别有用。
2条答案
按热度按时间798qvoo81#
一个不太优雅但更方便的解决方案是为Scaffold分配一个GlobalKey,然后使用key. ... currentState属性来获得ScaffoldState,而不是使用Scaffold. of()函数。
eqqqjvef2#
Scaffold
只是一个小部件,任何小部件的key
属性都会在该小部件在树中移动时保留状态。对于the documentation for the key property:控制一个小部件替换树中另一个小部件的方式。
如果两个小部件的runtimeType和key属性分别为operator==,则新小部件通过更新底层元素(即,通过使用新小部件调用Element.update)来替换旧小部件。否则,旧元素将从树中删除,新小部件将膨胀为元素,并将新元素插入树中。
此外,使用GlobalKey作为widget的键允许元素在树中移动(改变父元素)而不会丢失状态。当找到新的widget(其键和类型与同一位置的前一个widget不匹配),但在前一帧的树中的其他地方有一个具有相同全局键的widget时,则该widget的元素被移动到新的位置。
通常,作为另一个小部件的唯一子小部件不需要显式键。
来自Flutter团队的Here is a helpful video更深入地介绍了何时何地使用钥匙以及您可能使用的各种类型的钥匙,具体取决于情况。2:20的视频部分特别有用。