Flutter 的key

573 阅读1分钟

Key 的分类

key直接的子类主要有:LocalKey和GlobalKey

  • LocalKey:它应用于具有相同父Element的widget比较,也是diff算法的核心.
  • GlobalKey:通常我们会使用GlobalKey来引用某个Widget对应的State或Element

LocalKey

ValueKey

ValueKey是当我们以特定的值作为key时使用,比如一个字符串、数字等.

ObjectKey

参数是一个Object.

ValueKey和ObjectKey的区别: ValueKey判断key是否相等是通过 == 判断.ObjectKey判断是否相等是通过identical判断,identical是通过是否是同一个引用来判断是否相等.

== 和identical的区别

UniqueKey

如果我们要确保key的唯一性,可以使用UniqueKey.

GlobalKey

GlobalKey可以帮助我们访问某个Widget的信息,包括Widget或State或Element等对象.

class DemoPage extends StatefulWidget {
  @override
  _DemoPageState createState() => _DemoPageState();
}

class _DemoPageState extends State<DemoPage> {
  final GlobalKey<_GlobalKeyDemoState> globalKey = GlobalKey<_GlobalKeyDemoState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: GlobalKeyDemo(key: globalKey,),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          print(globalKey.currentState.stateValue);
          print(globalKey.currentState.widget.widgetValue);
        },
        child: Icon(Icons.delete),
      ),
    );
  }
}

class GlobalKeyDemo extends StatefulWidget {
  final String widgetValue = "widget";

  GlobalKeyDemo({Key key}):super(key: key);

  @override
  _GlobalKeyDemoState createState() => _GlobalKeyDemoState();
}

class _GlobalKeyDemoState extends State<GlobalKeyDemo> {
  String stateValue = "state";
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}