Flutter中最熟悉的陌生人——key

Flutter中的widget分为Stateless Widget和Stateful Widget两大类,实际应用中设置key对Stateless Widget影响不大,主要是在Stateful Widget中会有不同的效果,下面我们一起来看看。

首先,我们应该清楚Flutter中的widget都是不可变的,不管是Stateful Widget还是Stateless Widget,就是一旦创建就不能再修改了,但是state对象是可以被修改的。

当我们在widget tree中插入了一个widget时,Flutter Framework会根据widget配置在element tree中对应的location位置插入一个element对象。如果删除了一个widget,同样会把对应location的element对象从树中节点删除。还有一种最普遍的情况就是widget的location变了,如果没有设置key的话,那element对象和widget之间只会通过类型来查找,所以会导致widget信息更新了,但是state信息没有更新,比如同一级的两个相同Type的statefulWidget交换了位置,结果只有widget的信息“交换”了(这里的交换打引号,是因为不是widget真的交换了,widget是不可变的,其实是重建了widget对象),但是state中的信息确没能交换,这是因为state是被element对象持有,两个widget的Type是相同的,所以只要是在同一级中Type相同的element对象就能和widget关联,就会导致widget和element对象不能正确的关联。

设置了key之后,widget就会通过key去同一级中查找element对象并关联,所以此时element对象也能交换到正确的location,state中的信息就也能成功交换了。当然,如果我们修改了widget的key,此时widget找不到相同key的element对象就会创建新的element对象,同时旧的key的element对象就会从节点中删除;如果我们删除了widget的key,那么之前这个key的element对象也找不到对应的widget来关联,那么这个element对象会从节点中删除,同时也会创建一个没有key的新的element对象。

你可能感兴趣的:(Flutter中最熟悉的陌生人——key)