美文网首页
Flutter中的Key

Flutter中的Key

作者: E术家 | 来源:发表于2020-06-18 18:56 被阅读0次

    Key本身是一个抽象类

    LocalKey

    static bool canUpdate(Widget oldWidget, Widget newWidget) {
        return oldWidget.runtimeType == newWidget.runtimeType
            && oldWidget.key == newWidget.key;
      }
    

    用作diff算法的核心所在!用作Element和Widget进行比较!

    • ValueKey 以一个数据作为Key。如:数字、字符
    • ObjectKey以Object对象作为Key
    • UniqueKey可以保证Key的唯一性!(一旦使用Uniquekey那么就不存在Element复用 了!)

    GlobalKey

    • GlobalKey可以获取到对应的Widget的State对象!
    class GlobalKeyDemo extends StatelessWidget {
      final GlobalKey<_ChildPageState> _globalKey = GlobalKey();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('GlobalKeyDemoo'),
          ),
          body: ChildPage(
            key: _globalKey,
          ),
          floatingActionButton: FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () {
                //在StatelessWidget中改变StatefulWidget里的内容并刷新UI
                _globalKey.currentState._count++;
                _globalKey.currentState.data =
                    'old' + _globalKey.currentState._count.toString();
                _globalKey.currentState.setState(() {});
              }),
        );
      }
    }
    
    class ChildPage extends StatefulWidget {
      ChildPage({Key key}) : super(key: key);
      @override
      _ChildPageState createState() => _ChildPageState();
    }
    
    class _ChildPageState extends State<ChildPage> {
      int _count = 0;
      String data = 'hello';
    
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Column(
            children: <Widget>[
              Text(_count.toString()),
              Text(data),
            ],
          ),
        );
      }
    }
    

    相关文章

      网友评论

          本文标题:Flutter中的Key

          本文链接:https://www.haomeiwen.com/subject/ekouxktx.html