「这是我参加2022首次更文应战的第5天,活动概况查看:2022首次更文应战」
什么是key
咱们经过源码能够看到Key
的界说:
@immutable
abstract class Key {
const factory Key(String value) = ValueKey<String>;
@protected
const Key.empty();
}
-
Key
本身是一个抽象类; - 经过工厂结构办法能够创立一个
ValueKey
;
经过ValueKey
的界说能够发现,value
能够使任意类型;
Key
有两个直接子类:LocalKey
和GlobalKey
;
-
LocalKey
:是Flutter
增量渲染算法的中心,经过LocalKey
来决定Element
是否需求保留或许删除;它有几个子类:-
ValueKey
:以值作为参数(数字、字符串); -
ObjectKey
:以对象作为参数; -
UniqueKey
:创立唯一标识;
-
-
GlobalKey
:用来协助咱们确定某一个Widget
、Element
或许State
,来访问其信息;它在整个程序中是唯一的
;
GlobalKey的运用
咱们先来看一段代码:
咱们想要经过点击按钮来改动Text
中的数字,目前依照这个代码的逻辑是无法完成的,由于按钮在StatelessWidget
中,如果想要改动某一个Widget
的值,咱们需求在按钮的点击办法中调用setState
办法,而StatelessWidget
是没有setState
办法的;
依照咱们之前的思路是无法完成的,可是经过GlobalKey
能够达到相同的目的;
咱们将GlobalKeyDemo
的代码修正如下:
- 咱们在
GlobalKeyDemo
中创立一个GlobalKey
用来获取_ChildPageState
(想要经过GlobalKey
获取什么,就在泛型中传什么。比方传ChildPage
来直接获取ChildPage
); - 在
ChildPage
结构函数中传key
属性传值_globalKey
; - 由于在
ChildPage
的结构函数中调用了super
,所以_globalKey
将会和ChildPage
绑定;
咱们能够经过_globalKey
获取相关信息:
咱们将代码修正如下:
按钮的点击办法完成如下:
FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () {
_globalKey.currentState?.setState(() {
_globalKey.currentState?.data = '谢谢' + _globalKey.currentState!.count.toString();
_globalKey.currentState?.count ++;
});
},
),
经过_globalKey.currentState
能够直接获取data
、count
等属性进行操作;
咱们也能够创立多个GlobalKey
来获取不同的组件;
咱们一般经过GlobalKey
来操作子部件
,虽然也能够经过属性传值的方法将GlobalKey
保存传递给其他非子部件
运用,可是一般不引荐;