[Flutter]理解Widget-Key的作用

news2024/11/26 21:46:22
这里主要是理解在Widget中key的作用/用途。
import 'dart:math';

import 'package:flutter/material.dart';

/// 这里主要是理解在Widget中key的作用/用途。
void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: _MyHomePage(),
    );
  }
}

typedef ItemBuilder = Widget Function(String name);

class _MyHomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<_MyHomePage> {
  final List<String> _names = ["aaa", "bbb", "ccc"];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Test'),
      ),
      body: Row(
        children: [
          // StatelessWidget的Key为null。
          _buildRowChild((name) => ListItemLess(name)),
          // StatelessWidget的Key与数据键相对应。
          _buildRowChild(
              (name) => ListItemLess(name, key: ValueKey('Less' + name))),
          // StatefulWidget的Key为null。
          _buildRowChild((name) => ListItemFul(name)),
          // StatefulWidget的Key与数据键相对应。
          _buildRowChild(
              (name) => ListItemFul(name, key: ValueKey('Ful' + name))),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.delete),
        onPressed: () {
          setState(() {
            _names.removeAt(0);
          });
        },
      ),
    );
  }

  Widget _buildRowChild(ItemBuilder itemBuilder) {
    return Expanded(
      child: ListView(
        //children: _names.map((name) => ListItemLess(name)).toList(),
        children: _names.map(itemBuilder).toList(),
      ),
    );
  }
}

class ListItemLess extends StatelessWidget {
  ListItemLess(this.name, {super.key});
  final String name;
  final Color randomColor = Color.fromARGB(
      255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256));
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 80,
      child: Text(name),
      color: randomColor,
    );
  }
}

class ListItemFul extends StatefulWidget {
  const ListItemFul(this.name, {super.key});
  final String name;
  @override
  _ListItemFulState createState() => _ListItemFulState();
}

class _ListItemFulState extends State<ListItemFul> {
  final Color randomColor = Color.fromARGB(
      255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256));
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 80,
      child: Text(widget.name),
      color: randomColor,
    );
  }
}

运行结果如下图所示:

​​​​​​​   

/// 运行并依次点击删除两次, 根据情况可以发现其更新结果:
/// (1) StatelessWidget不管是否设置了Key或者前后Key是否相同, 其背景色都没有复用;
/// (2) StatefulWidget未设置Key的时候, 其背景色不变, 但是数据向上移了;
/// (3) StatefulWidget设置Key的时候, 在更新过程中根据key进行了diff算法,
/// 在相同Key的前后进行对比时, 发现bbb对应的Element和ccc对应的Element会继续复用,
/// 那么就会删除之前aaa对应的Element, 而不是直接删除最后一个Element 。
///
///
/// 官方对Widget的说明:
/// Flutter的Widgets的灵感来自React, 中心思想是构造你的UI使用这些Widgets。
/// Widget使用配置和状态, 描述这个View(界面)应该长什么样子。
/// 当一个Widget发生改变时, Widget就会重新build它的描述, 框架会和之前的描述进行对比,
/// 来决定使用最小的改变(minimal changes)在渲染树中, 从一个状态到另一个状态。
///
///
/// 自己对Widget的理解:
/// Widget就是一个个描述文件, 这些描述文件在我们进行状态改变时会不断的build。
/// 但是对于渲染对象来说, 只会使用最小的开销来更新渲染界面。
///
///
/// 参考链接:  Flutter的Widget-Element-RenderObject  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vault从入门到精通系列之二:启动Vault服务器

Vault从入门到精通系列之二&#xff1a;启动Vault服务器 一、启动开发服务器二、设置环境变量三、验证服务器正在运行四、vault命令汇总 Vault 作为客户端-服务器应用程序运行。Vault 服务器是唯一与数据存储和后端交互的 Vault 架构。通过 Vault CLI 完成的所有操作都通过 TLS…

【Leetcode60天带刷】day09字符串—— 459.重复的子字符串,28. 实现 strStr(),剑指Offer 05.替换空格

题目&#xff1a; 459. 重复的子字符串 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例…

Grammarly:AI语法检测写作助手工具

【产品介绍】 Grammarly是于2009年发布&#xff0c;当前使用最普遍和准确的英语语法检查&#xff08;grammar checker&#xff09;、拼写、校对&#xff08;proofreading&#xff09;检查和抄袭&#xff08;plagiarism&#xff09;检测软件工具&#xff0c;其中Grammarly校对检…

pytorch笔记:transformer 和 vision transformer

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN seq2seq 可以是 CNN&#xff0c;RNN&#xff0c;transformer nn.Transformer 关键源码&#xff1a; encoder_layer TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, ba…

杂谈 | 人类微生物组研究:解析挑战与前景

谷禾健康 人类微生物组研究正在从描述关联发展到了解整个微生态对人类的影响。虽然存在挑战&#xff0c;但在应用数据驱动的微生物组诊断和干预方面正在取得进展&#xff0c;这可能会在未来十年内带来精准医学的突破。 本文我们来探讨关于微生物组的研究进展及其对人类健康的影…

Windows10配置Kiosk(展台)模式

Windows10配置Kiosk&#xff08;展台&#xff09;模式 新建Kiosk专用用户 进入windows设置->账户->家庭与其他用户&#xff0c;点击’将其他人添加到这台电脑’ 在弹出的对话框里&#xff0c;点击我没有这个人的登录信息&#xff0c;然后添加一个没有Microsoft账户的用…

什么是眼图

眼图是指示波器用余辉方式将捕获的波形按每3bit的形式累积叠加显示采集到的串行信号的比特位的结果&#xff0c;叠加后的图形形状看起来和眼睛很像 眼图有很多参数&#xff0c;可以用来量化信号的质量&#xff0c;例如&#xff1a; 眼高&#xff1a;指眼图中最大和最小电压之差…

WOT全球技术创新大会2023在京召开:创新不止,实战为王

AIGC、大模型、大算力异常火爆的背后&#xff0c;其应用场景是什么、商业实践有何规律可循&#xff1f;多云实践、业务架构演进、研发效能等看似“老生常谈”的技术热点&#xff0c;在崇尚业务创新的当前时代有何新的发展趋势&#xff1f; 6月16-17日&#xff0c;51CTO集结50来…

android存储2--初始化.存储service的启动

android版本&#xff1a;android-11.0.0_r21 http://aospxref.com/android-11.0.0_r21/ android存储初始化分3个阶段&#xff1a; 1&#xff09;清理环境。因android支持多用户&#xff0c;解锁后登录的可能是另一个用户&#xff0c;需把之前用户执行的一些信息清理干净。《an…

Net6.0项目升级到Net7.0

NetCore3.1升级到Net6.0&#xff0c;可参考此文章&#xff1a;NetCore3.1项目升级到Net6.0_vs2022 没有startup_csdn_aspnet的博客-CSDN博客 其实与我之前发布的步骤基本一致&#xff0c;升级到net6.0之后&#xff0c;在升级net7.0基本没有可修改的代码&#xff0c;只是升级一…

NOTA双功能螯合剂:NOTA PEG11 MeTz,NOTA PEG11 Azide,两者试剂信息知识总结说明

NOTA及其衍生物是新型双功能整合剂之一。NOTA及其衍生物具有良好的配位和鳌合能力&#xff0c;可作为过渡金属离子的配体。 本文主要就NOTA PEG11 MeTz&#xff0c;NOTA PEG11 Azide两者进行说明&#xff0c;以下内容希望可以帮助到大家。 一、MeTz-PEG11-NOTA 理论分析&#…

【spring源码系列-06】refresh中obtainFreshBeanFactory方法的执行流程

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

汽车云端主题的实现与应用

主题指的是车载电子中&#xff0c;如仪表&#xff0c;IVI等跟视觉相关的显示设备、包括车身&#xff0c;在不同的自定义模式下的不同显示表现。我们也可以把它理解成为皮肤。 传统的车身皮肤&#xff08;别克ELECTRA E5&#xff09; 传统主题的特点 固定&#xff0c;单一&…

使用Flow发送企业应用的通知到微信里

今天我们以kintone作为企业应用管理平台来解释&#xff0c;怎么使用flow发送企业的通知到微信上。 完成后的样子 &#xff11;&#xff0e;Microsoft Flow响应kintone添加记录的Webhook。 &#xff12;&#xff0e;Microsoft Flow向微信发送消息。 微信是什么&#xff1f; …

【Leetcode60天带刷】day13栈与队列—— 239. 滑动窗口最大值,347.前 K 个高频元素

题目&#xff1a; 239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xf…

Git进阶系列 | 1. 创建完美的提交

Git是最流行的代码版本控制系统&#xff0c;这一系列文章介绍了一些Git的高阶使用方式&#xff0c;从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章&#xff0c;这是第一篇。原文&#xff1a;Creating the Perfect Commit in Git[1] Git中的提交可以是以下两种情况之一…

jenkins下载gitlab自动化用例并每日批跑

1.安装Jenkins ---待补充 2.安装用例执行节点&#xff08;虚拟机&#xff09; 用例执行的虚拟机&#xff0c;需要安装python环境与依赖包&#xff08;自动化脚本依赖包&#xff09;&#xff0c;需要申请外网权限&#xff08;安装python依赖需要外网&#xff09;。执行机需要挂…

四大技巧,教你如何加速手动UI测试

用户界面测试&#xff08;UI测试&#xff09;是软件开发过程中的一个重要组成部分。单元测试和集成测试可以确保代码正常运行&#xff0c;UI测试则帮助您确保用户在使用过程中获得最佳体验。这些测试有一个共同的挑战——创建和维护可能非常耗时&#xff0c;尤其是手动测试。 …

vscode配置远程linux开发环境

vscode配置远程linux开发环境 1. linux 要运行sshd服务2. 在vscode上安装Remote Development插件3. 配置远程linux主机的信息4. 远程连接linux 1. linux 要运行sshd服务 使用命令&#xff0c;查看 22端口是否被监听&#xff0c;这个端口是远程连接软件所用到的端口 netstat -…

mysql8.0版本降到5.7版本(下载配置mysql5.7压缩包版本)

目录 一、前言 二、官网下载与解压 三、配置环境变量 四、检查测试当前MySQL版本 五、获取资源 一、前言 在部署项目的时候&#xff0c;有时候8.0版本的MySQL就会报错&#xff0c;这个时候就要换MySQL的版本了&#xff0c;5.7的版本还是比较稳定的。 二、官网下载与解压…