key和globalkey的使用,在实际开发中还是经常使用到的,尤其是globalkey设置到局部刷新会经常用到,例如TextView局部刷新等,还有其它任何控件需要局部刷新的也可以通过globalkey来实现,下面会有详细介绍。
key是标识widget的唯一性,组件能不能复用和更新主要通过key和组件的类型(runtimeType)来判断,如果key不传,则会判断组件的类型,globalkey是继承key的,根据名字就知道这是整个APP里面都是全局唯一性的。下面会有更详细的介绍,先介绍key的使用。
通过查看flutter的源码知道key的用法,源码在framework.dart文件里,key主要用来判断要不要更新组件
1 2 3 4 | static bool canUpdate(Widget oldWidget, Widget newWidget) { return oldWidget.runtimeType == newWidget.runtimeType && oldWidget.key == newWidget.key; } |
当一个主页面比较复杂时,会包含多个widget,如果直接调用setState,会遍历所有子Widget的build,这是非常不必要的性能开销,有没有单独刷新指定Widget的方式呢?这个时候就要用到GlobalKey了
使用前提
globakey 需要包裹你要更新的子weight
例如
import 'package:cell_input/globalkey/button.dart';
import 'package:cell_input/globalkey/text.dart';
import 'package:flutter/material.dart';
class TestWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _TestWidgetState();
}
}
class _TestWidgetState extends State<TestWidget> {
int _count=0;
//包裹你定义的需要更新的weight
GlobalKey<TextWidgetState> textKey = GlobalKey();
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextWidget(textKey),///需要更新的Text
SizedBox(height: 20,),
Text(_count.toString(),style: TextStyle(fontSize: 20),), ///这个Text不会刷新,只会刷新上面的TextWidget
SizedBox(height: 20,),
ButtonWidget(
onPressed: () {
///点击button,调用TextWidget的onPressed方法
///在TextWidget的onPressed中单独调用TextWidget的setState,
_count++;
textKey.currentState.onPressed(_count);
},
)
],
),
);
}
}
GlobalKey<TextWidgetState> textKey = GlobalKey();
这个weight 就是需要更新的界面,
import 'package:flutter/material.dart';
class TextWidget extends StatefulWidget {
TextWidget(Key key) : super(key: key);
@override
State<StatefulWidget> createState() {
return TextWidgetState();
}
}
class TextWidgetState extends State<TextWidget> {
String _text="0";
@override
Widget build(BuildContext context) {
return Center(
child: Text(_text,style: TextStyle(fontSize: 20),),
);
}
void onPressed(int count) {
setState(() {
_text = count.toString();
});
}
}
1