「这是我参加2022首次更文应战的第5天,活动概况查看:2022首次更文应战」

什么是key

咱们经过源码能够看到Key的界说:

@immutable
abstract class Key {
  const factory Key(String value) = ValueKey<String>;
  @protected
  const Key.empty();
}
  • Key本身是一个抽象类
  • 经过工厂结构办法能够创立一个ValueKey

Flutter(三十七)-GlobalKey的使用

经过ValueKey的界说能够发现,value能够使任意类型;

Key有两个直接子类:LocalKeyGlobalKey

  • LocalKey:是Flutter增量渲染算法的中心,经过LocalKey来决定Element是否需求保留或许删除;它有几个子类:
    • ValueKey:以值作为参数(数字、字符串);
    • ObjectKey:以对象作为参数;
    • UniqueKey:创立唯一标识;
  • GlobalKey:用来协助咱们确定某一个WidgetElement或许State,来访问其信息;它在整个程序中是唯一的

GlobalKey的运用

咱们先来看一段代码:

Flutter(三十七)-GlobalKey的使用

咱们想要经过点击按钮来改动Text中的数字,目前依照这个代码的逻辑是无法完成的,由于按钮在StatelessWidget中,如果想要改动某一个Widget的值,咱们需求在按钮的点击办法中调用setState办法,而StatelessWidget是没有setState办法的;

依照咱们之前的思路是无法完成的,可是经过GlobalKey能够达到相同的目的;

咱们将GlobalKeyDemo的代码修正如下:

Flutter(三十七)-GlobalKey的使用

  • 咱们在GlobalKeyDemo中创立一个GlobalKey用来获取_ChildPageState(想要经过GlobalKey获取什么,就在泛型中传什么。比方传ChildPage来直接获取ChildPage);
  • ChildPage结构函数中传key属性传值_globalKey
  • 由于在ChildPage的结构函数中调用了super,所以_globalKey将会和ChildPage绑定;

咱们能够经过_globalKey获取相关信息:

Flutter(三十七)-GlobalKey的使用

咱们将代码修正如下:

Flutter(三十七)-GlobalKey的使用

按钮的点击办法完成如下:

FloatingActionButton(
  child: const Icon(Icons.add),
  onPressed: () {
    _globalKey.currentState?.setState(() {
      _globalKey.currentState?.data = '谢谢' + _globalKey.currentState!.count.toString();
      _globalKey.currentState?.count ++;
    });
  },
),

经过_globalKey.currentState能够直接获取datacount等属性进行操作;

咱们也能够创立多个GlobalKey来获取不同的组件;

咱们一般经过GlobalKey来操作子部件,虽然也能够经过属性传值的方法将GlobalKey保存传递给其他非子部件运用,可是一般不引荐;