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是通过是否是同一个引用来判断是否相等.
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();
}
}