美文网首页Flutter
Flutter 中 key 的原理及作用

Flutter 中 key 的原理及作用

作者: 晨曦的简书 | 来源:发表于2021-11-29 15:22 被阅读0次

Key 的原理

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

如图 1 所示,当我们生成一个 Widget 树的时候也会对应生成 Element 树,WidgetElement 一一对应。但是当我们移除 Widget1 的时候会调用 ElementcanUpdate 方法,canUpdate 方法中会判断旧的 Widget 与新的 WidgetruntimeType 是否相等,且 key 是否相等。当我们不使用 key 时候,就会默认它们相等,就会如图 2 所示,Element1 就会比较 oldWidget.runtimeType == newWidget.runtimeType,因为 Element1 曾经指向的类型与 Widget2 类型相同所以 Widget2 就会复用 Element1,同理 Widget3 就会复用 Element2,依次比较,当 Element3 没有指向的时候就会被移除。所以 Key 的作用可以用来跟 Widget 做绑定,判断 canUpdate 是否执行。

  • Key 本身是一个抽象类,有一个工厂程构造方法 ValueKey()
  • 直接子类主要有:LocalKeyGlobalKey
  • LocalKey 是增量算法的核心,决定哪个 Element 要保留,哪个 Element 要删除。以下是 LocalKey 的三个子类。
    • ValueKey:以值作为参数(数字、字符串)
    • ObjectKey:以对象作为参数
    • UniqueKey:创建唯一标识
  • GlobalKey 对应某一个 Widget 或者 State 或者 Element

GlobalKey 的使用

class GlobalKeyDemo extends StatelessWidget {
  final GlobalKey<_ChildPageState> _globalKey = GlobalKey();
  
  GlobalKeyDemo({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('GlobalKeyDemo'),
      ),
      body: ChildPage(key: _globalKey,),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // _globalKey.currentContext
          // _globalKey.currentWidget
          _globalKey.currentState?.setState(() {
            _globalKey.currentState?.data = '666';
            _globalKey.currentState?.count++;
          });
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}

class ChildPage extends StatefulWidget {
  const 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: [
          Text(count.toString()),
          Text(data)
        ],
      ),
    );
  }
}

如案例所示,当 FloatingActionButtononPressed 闭包函数执行的时候我们想修改 _ChildPageStatecountdata 的值,我们可以在 GlobalKeyDemo 中定义 _globalKey = GlobalKey(),在初始化 ChildPage 的时候把 _globalKey 作为参数传递。这时候我们可以通过 _globalKey.currentContext_globalKey.currentWidget_globalKey.currentState 获取我们想拿到的部件,这里我们通过 _globalKey.currentState就能获取到 _ChildPageState 修改 datacount 属性,并调用 setState 方法。个人感受 Flutter 中的 GlobalKey 有点类似 iOSUIViewtag 属性,可以通过 tag 来获取到对应的 UIView 控件。

相关文章

  • Flutter 中 key 的原理及作用

    Key 的原理 如图 1 所示,当我们生成一个 Widget 树的时候也会对应生成 Element 树,Widge...

  • Flutter中key的作用

    作者:森码 链接:https://www.jianshu.com/p/57debb89a24f 来源:简书 文章来...

  • Flutter中key的作用

    概述 在Widget的构造方法中,有Key这么一个可选参数,Key是一个抽象类,有LocalKey和GlobalK...

  • flutter中key的作用

    1.setState的原理 setstate会触发canUpdate函数的调用,这个函数会对比old widget...

  • Flutter中key的作用

    文章来源于Flutter Widgets 101 Ep. 4,感兴趣的同学可以直接看视频,更便于理解。 首先,我们...

  • Flutter 中widget key的作用

    flutter 的构成。flutter 包括三个树形结构 widget树、element树、RenderingOb...

  • 二、Flutter中Key的作用

    在Flutter中每个Widget的构造方法都提供了一个可选参数Key,这个Key有什么用呢? 1、案例 现在看一...

  • Flutter - Key的原理

    前言 上篇文章我们简单探索了Flutter的渲染原理---Flutter初探渲染原理初探[https://www....

  • React中的domDiffing算法

    1.react/vue中的key有什么作用?(key的内部原理是什么) (1)简单地说:key是虚拟DOM对象的标...

  • react / vue中的key有什么作用

    一、react/vue中的key有什么作用?(key的内部原理是什么?)二、为什么遍历列表时,key最好不要用in...

网友评论

    本文标题:Flutter 中 key 的原理及作用

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