Flutter 中的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"),
    );
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值