key --- Value
模式模式下,value就是我们的widget
为什么要有key?
flutter中是增量更新,只更新了差异点。
任何的恶widget都有key。
有些时候不使用key。会导致渲染引擎失控,更新的时候没有参考物key.
为什么会有上面失控的情况?
---------Widget. Tree-------------------- 内部渲染引擎 Element Tree---
| |
--------一系列的类。--------对应--------------实例-------------------
-------例如:My,My,My,-----------------MyElement,MyElement,MyElement--
有状态1,状态2,状态3.
如果是相同的类型,才会考虑key来解决
当MY删除一个是后,就会导致类型和Element无法对应。
对应关系不一致导致失控
全局的key是什么
abstract class Key {
/// Construct a [ValueKey<String>] with the given [String].
///
/// This is the simplest way to create keys.
const factory Key(String value) = ValueKey<String>;
/// Default constructor, used by subclasses.
///
/// Useful so that subclasses can call us, because the [Key.new] factory
/// constructor shadows the implicit constructor.
@protected
const Key.empty();
}
上面是抽象的key。
子类:LocalKey 局部的key,周围同一级的唯一性的保障,---开发尽量使用这个localkey性能更 高
---》 LocalKey的子类 ValueKey 等等。
GlobalKey 全局的key,整个app里的全局唯一性,性能就低一点。
//------------------------//
无状态的部件是不用考虑key的--一般情况
有状态的widget,并且有相同类型才考虑key。
//-------------------------//
ObjectKey --引用的对比。
ValueKey --值的对比。
UniqueKey()?
这个是主动放弃key的关系,现象是不会保持数据。
应用的场景---------》可以主动丢弃,来证明需要更新---强制性告诉flutter丢弃上一帧的key。