Flutter 中的key

Flutter | 深入浅出Key 前言 在开发 Flutter 的过程中你可能会发现,一些小部件的构造函数中都有一个可选的参数——Key。刚接触的同学或许会对这个概念感到很迷茫,感到不知所措。 在这篇文章中我们会深入浅出的介绍什么是 Key,以及应该使用 key 的具体场景。 什么是Key 在 Flutter 中我们经常与状态打交道。我们知道 Widget 可以有 Stateful 和 Stateless 两种。Key 能... 阅读详情

一 Key 的分类

Flutter 中的key 主要分为两类,

LocalKey  : 应用于具有相同父Element的Widget 进行比较,也是diff 算法的核心所在

GlobalKey :通常我们会使用GlobalKey 某个widget 对应的Widget 或State 或者Element

二 LocalKey的分类

1 ValueKey:

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

2 ObjectKey:

  • 如果两个学生,他们的名字一样,使用name作为他们的key就不合适了

  • 我们可以创建出一个学生对象,使用对象来作为key

3 UniqueKey

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

  • 比如我们之前使用随机数来保证key的不同,这里我们就可以换成UniqueKey;

三 GlobalKey

使用方式就是 声明一个globalKey,再把这个globalKey传给想要放到的widget里面

通过这个globalKey 可以访问到

currentContext: 可以找到包括renderBox在内的各种element有关的东西

// 这里可以通过currentContext 找到findRenderObject RenderBox属性里面
          RenderBox? renderObj =
              contentKey.currentContext?.findRenderObject() as RenderBox;
          print(renderObj.size);

currentWidget: 可以得到widget的属性

currentState: 可以得到state里面的变量.

 

1 简单使用

import 'package:flutter/material.dart';

class GlobalKeyDemoPage extends StatefulWidget {
  const GlobalKeyDemoPage({super.key});

  @override
  State<GlobalKeyDemoPage> createState() => _GlobalKeyDemoPageState();
}

class _GlobalKeyDemoPageState extends State<GlobalKeyDemoPage> {
  final GlobalKey<_GKDContentPageState> contentKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("123"),
      ),
      body: GKDContentPage(key: contentKey),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 获取其name 的值
          print("${contentKey.currentState!.widget.name}");
          // 获取其message 的值
          print("${contentKey.currentState!.message}");
          print("${contentKey.currentContext}");
        },
        child: Icon(Icons.add_a_photo),
      ),
    );
  }
}

class $ {}

class GKDContentPage extends StatefulWidget {
  final String name = "everything will be fine !!!";
  const GKDContentPage({super.key});

  @override
  State<GKDContentPage> createState() => _GKDContentPageState();
}

class _GKDContentPageState extends State<GKDContentPage> {
  final String message = "just do right things !!!";
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text("GKDContentPage"),
    );
  }
}

Flutter —— key 的原理 Flutter —— key 的原理1. Key 的原理2. Key 的 探究 之前的文章中有的类故意没有写Key,那么这个Key有什么作用呢?今天来探究一下。 1. Key 的原理 key 本身是一个抽象类,有一个工厂构造方法创建ValueKey 2. Key 的 探究 其实任何的Widget都是有key的,key是可以为空的。 创建一个KeyDemo放在MaterialApp的home里面 class KeyDemo extends StatefulWidget { const KeyDem 阅读详情

相关推荐

IOSKeychain:此Flutter插件可在iOS上提供钥匙串访问

IOS钥匙扣 此Flutter插件可在iOS上提供钥匙串访问 入门 dependencies : ios_keychain : git : url : git://github.com/ahmeteminkara/ios_keychain.git import 'package:ios_keychain/ios_keychain.dart' ; 使用 String value = await IOSKeychain . read ( _key ) ; bool status = await IOSKeychain . write ( _key , "DATA" ) ; bool status = await IOSKeychain . update ( _key , "NEW DATA" ) ; bool status = await IO

Flutter Keys: 你的终极指南,让 widget 世界更快乐

我们将讨论 UniqueKey、ValueKey、ObjectKey、PageStorageKey 和 GlobalKey — 所有这些很棒的 Key 类型都可以提升您的 Flutter 水平!

前端全栈开发者 816

使用 C# 开发海康设备实时视频流的监控与报警系统

本文介绍了如何使用C#结合海康威视SDK(HCNetSDK)开发安防监控系统,涵盖设备登录、视频流获取、报警处理和云台控制等核心功能。内容包括开发环境配置、系统架构设计、关键代码实现(如设备登录、实时视频播放、报警设置)以及用户界面设计。通过Windows Forms/WPF,开发者可构建完整的监控应用,实现设备管理、视频监控、报警响应等功能。系统采用模块化设计,便于扩展和维护,适用于各类安防场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1355

Flutter 几种 Key 的类型、使用场景及简单示例

ValueKey用于基于某个值(例如字符串、数字等)来唯一标识一个组件。适合切换相似视图的场景,例如在ListView中区分列表项,或动态切换输入框。

卡尔特斯 1078

NeRF必读:Mip-NeRF总结与公式推导

由于远景近景的分辨率不同,导致经典NeRF对于多尺度场景的表达存在明显瑕疵:NeRF对于近景的重建比较模糊而对于远景的重建出现锯齿。简单粗暴的策略是supersampling,但是费时费力。相较于NeRF使用的位置编码(PE)方式,Mip-NeRF提出了积分位置编码的方式(IPE).这种编码方式可以多尺度地描述空间中的信息分布,make sense.

i_head_no_back的博客 6077

实现单芯片2400bps 音频编解码方案

终于按照朋友的需求,帮他开发了一款单芯片集音频采集编码传送并接收解码播放功能的方案,交给快递公司邮寄给远在郑州的他.整个项目从开始定型到现在一个样机送出,整整花了1个月时间,感觉挺有成就感,挺有意思,工作是辛苦的,结果却是快乐的.现在将这中快乐的的心情与大家分享一下.    真个项目用一颗主控搞定,ARM9的,200KBytes 片内RAM,主频可以跑到300MHz,64pin LQFP封装

nyxsec的专栏 3682

Flutter入门进阶之旅(二十三)Flutter Key

key我们可以理解为每个控件所独有的一个ID,用以识别是哪个UI。有了key,element和renderObject就会被强行重建,从而得到所见即所得的效果。 key可以分为LocalKey和GlobalKey,字面上理解就是局部key和全局key。 具体分类如下: i LocalKey LocalKey 直接继承至 Key,它应用于拥有相同父 Element 的小部件进行比较的情况,也就是上述例子中,有一个多子 Widget 中需要对它的子 widget 进行移动处理,这时候你应该使用Local

谢栋的专栏 4155

淘特App x-sign参数逆向实战:从抓包到算法定位

本文详细解析了淘特App的x-sign参数逆向过程,从抓包分析到算法定位,涵盖了使用jadx-gui进行静态分析、Frida动态Hook验证以及Native层算法还原等关键技术。文章重点介绍了x-sign参数的生成机制及其在阿里系应用中的安全防护策略,为逆向工程师提供了实用的调试技巧和对抗策略。

5b6n7m8的博客 226

Flutter key

Flutter Key 当widget在widget tree中移动时,key可以保留它的状态. key可用于保留用户的滚动位置,或在修改集合时保持状态. 什么时候需要Key 如果你还没有用过key,说明你可能还不需要使用key. 事实也正是如此,大多数时候,我们不需要使用key. 但是如果你发现自己需要添加,删除或重新排序处于某种状态的相同类型的widget的集合的时候,可能就是需要用到key的时候了. 我们先用一个官方的例子来看一下key的作用 , 交换两个只有颜色不同的widget class Ke

卓原的进化之旅 1791

相机中的归一化实现讲解

本分讲解了图像处理中常出现的两个相机归一化操作

weixin_42102084的博客 1474

数学建模学习(120):使用Python实现基于AHP的供应商选择分析

使用Python实现基于AHP的供应商选择分析

全栈川川 909

Flutter中的Key

Key是Widget、Element 和 SemanticNodes 的标识符。Key 是Widget、Element 和 SemanticNodes的唯一标识。例如对于 Widget 在 Widget 树中改变了位置,Key 可以帮助它们保留状态。相对于无状态的Widget,Key对于有状态的 Widget 作用更大。

且听真言 2041

RK3568下GPIO模拟串口

在嵌入式开发中,硬件 UART 资源可能被其他外设占用。此时,通过 GPIO 模拟 UART(软串口)成为一种灵活的解决方案。本文基于 RK3568 平台,结合 Linux 内核模块,实现高精度软串口通信,并深入分析关键技术细节。可以看到已经接收到数据了,可以自己创建自定义的设备文件到/dev下,也可以按照串口设备的标准创建一个设备,后面有时间我写一篇和标准串口设备结合的gpio模拟串口文章。RK3568 GPIO 模拟串口(软串口)实现详解。将编译好的驱动放到板子上运行。再写个Makefile。

文石_2009的博客 363

Flutter 中的key、LocalKey、GlobalKey

当你有一个滑动列表,你通过某一个 Item 跳转到了一个新的页面,当你返回之前的列表页面时,你发现滑动的距离回到了顶部。LocalKey 直接继承至 Key,它应用于拥有相同父 Element 的小部件进行比较的情况,也就是上述例子中,有一个多子 Widget 中需要对它的子 widget 进行移动处理,这时候你应该使用Localkey。如果您有一个 Todo List 应用程序,它将会记录你需要完成的事情。如果你有一个生日应用,它可以记录某个人的生日,并用列表显示出来,同样的还是需要有一个滑动删除操作。.

Dream It Possible 2049

【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Flutter 中的key、LocalKey、GlobalKey等等

key之间的关系 key @immutable abstract class Key { const factory Key(String value) = ValueKey<String>; @protected const Key.empty(); } 默认创建 Key 将会通过工厂方法根据传入的 value 创建一个 ValueKey。 Key 派生出两种不同用...

XueQiYa的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Flutter之Key

As,s ands.key是s,s ands的标识符key在具有相同父级的元素中,必须是唯一的。

weixin_43244083的博客 669

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

理解Flutter的key

Flutter的所有Widget的构造函数都有一个optional的Key参数,你可以指定,也可以不指定。 在用Flutter进行开发时,大多数情况下,我们并不需要为widget指定key。但今天我却碰到了一个由key引发的问题。我有一个ListView,我要让用户可以删掉其中的任何item。当我将某个数据从数组中删掉,然后setState时,发现列表没有变化。因为之前有写过一点Re...

clcwcxfwf的专栏 1655

Flutter Key

前言 在开发 Flutter 的过程中你可能会发现,一些小部件的构造函数中都有一个可选的参数——Key。刚接触的同学或许会对这个概念感到很迷茫,感到不知所措。 在这篇文章中我们会深入浅出的介绍什么是 Key,以及应该使用 key 的具体场景。 什么是Key 在 Flutter 中我们经常与状态打交道。我们知道 Widget 可以有 Stateful 和 Stateless 两种。Key 能够帮助开发者在 Widget tree 中保存状态,在一般的情况下,我们并不需要使用 Key。那么,究竟什么时候

大灰狼的小绵羊哥哥的博客 380

一篇文章带你看懂Flutter中的Key

Flutter中的Key,一直都是作为一个可选参数在很多Widget中出现,那么它到底有什么用,它到底怎么用,本篇文章将带你从头到尾,好好理解下,Flutter中的Key。

yihanss的博客 2570

Flutter中Key的作用

Flutter开发中经常碰到一种现象,当我们调用setState更新UI时,StatefulWidget状态会莫名其妙显示错误。适用于同一父级下需要区分不同实例的场景。:当你有一个复杂的对象,并且希望根据这个对象来区分。在这种情况下,如果相同类型的。:当你需要区分同一父级下的多个相同类型的。,这样 Flutter 在更新时会根据。都相同,Flutter 会直接复用。:每次创建时都会生成一个独一无二的。时,Flutter 会在整个。:当你希望每次更新时都强制刷新。仍然会复用之前的实例,导致。

wucomi的博客 1061

Flutter 中的 Key 你真的了解吗?

最近在写一些Flutter的跨端应用,发现在同一个Column中使用2个TextFiled后,动态删除其中一个TextFiled后,发现里面填写的内容错乱了。然后我使用搜索大法,发现是我没有为这2个TextFiled设置不同的Key。秉着知其然,知其所以然的态度,我看了一些博客的分析,大部分都是很早之前的内容,且没有对照源码进行分析,有些博客的分析甚至是错误的,所以我对着源码来和Demo去一步步分析。

zhujiangtaotaise的专栏 1065

Flutter中key的作用

Key Class官方介绍:

bugyinyin的博客 873

Flutter中的Key和GlobalKey

1.Key 参考:https://api.flutter.dev/flutter/widgets/Widget/key.html 控制一个widget该如何替换掉树中的另一个widget:如果两个widget的runtimeType 和 key都相等(==),那么会让旧widget所对应的旧element转而指向新widget(即调用element.update);否则,旧element会被从...

三杯两盏 1万+
上一篇: Flutter 了解 Element
下一篇: Flutter InheritedWidget
Leonardo_Fibonacci
博客等级 码龄10年 110粉丝 247原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值