Flutter 是一个使用 Dart 语言构建的 UI 工具包,因此它完全遵循 Dart 的语法和规则。Dart 中的 const 是语言层面的特性,而 Flutter 因其声明式 UI 和频繁重建的特性,将 const 的效能发挥到了极致。

Dart 中的 const(语言层面)

在 Dart 语言中,const 用于创建编译时常量。它的核心特性如下:

1. 编译时确定

编译时确定const 变量的值必须在代码编译时就能完全确定。它不能是运行时才能计算出来的值。

// 正确示例
const int a = 1;
const double b = 1.0 + 2.0; // 编译器能计算这个结果
const List<int> c = [1, 2, 3];// 错误示例
var currentTime = DateTime.now();
const d = currentTime; // 错误!DateTime.now()是运行时值
const e = someFunction(); // 错误!函数返回值是运行时值

2. 规范化和唯一性

规范化和唯一性:在程序整个生命周期中,相同的 const 表达式只会被计算一次,并在内存中创建唯一的一个实例

const list1 = [1, 2];
const list2 = [1, 2];
const list3 = [1, 2];print(identical(list1, list2)); // 输出:true
// identical 检查两个引用是否指向同一个对象
// list1, list2, list3 都是同一个实例

3. 深度不可变

深度不可变const 构造的对象及其所有字段都必须是不可变的(final)。一旦创建,就无法更改。

const list = [1, 2, 3];
list.add(4); // 运行时报错:Cannot add to an unmodifiable list

4. 递归的 const

递归的 const:要创建一个 const 的集合(如 List、Map、Set),其所有元素也必须是编译时常量。

const list = [1, 2, [3, 4]]; // 内部嵌套的列表 [3,4] 也必须是 const

Flutter 中的 const(应用层面)

Flutter 完全使用 Dart 语言,因此上面的所有规则都适用。Flutter 中 const 的特殊之处在于它的应用场景和带来的巨大性能 benefits

为什么 const 在 Flutter 中如此重要?
因为 Flutter 的 UI 是通过嵌套的 Widget 树来构建的,而 build 方法会因状态变化、动画等而被非常频繁地调用(每秒60/120次)。每次调用 build 都会创建一棵新的 Widget 树。

没有 const 的情况:
Widget build(BuildContext context) {return Container(child: Text('Hello'), // 每次build都创建一个新的Text实例); // 每次build都创建一个新的Container实例
}
  • 内存压力:创建大量短暂的 Widget 实例。

  • GC 压力:垃圾回收器需要频繁工作,可能引起界面卡顿。

  • Diff 效率低:Flutter Framework 需要比较新旧 Widget 树。即使UI没变,新创建的实例也会让框架做更多比对工作。

使用 const 的情况:
Widget build(BuildContext context) {return const Container(child: Text('Hello'), // 永远是内存中同一个实例); // 永远是内存中同一个实例
}
  • 零内存开销:Widget 实例在编译时即被创建,build 方法只是复用它们。

  • 无 GC 压力:不产生垃圾对象。

  • 极速 Diff:Flutter Framework 看到 identical(oldWidget, newWidget) == true,会直接跳过这个节点及其整个子树的比对,大幅提升效率。

对比总结:Dart const vs. Flutter const

特性Dart 中的 const (通用概念)Flutter 中的 const (具体应用)
本质语言关键字,用于创建编译时常量就是 Dart 的 const,主要用于构建 Widget 和相关类
目的保证不可变性、实现数据共享性能优化:减少重建开销,提升应用流畅度
主要应用对象基础类型(int, String)、集合、自定义类WidgetEdgeInsetsBorderRadiusColorsTextStyle 等
核心 benefit保证程序正确性、节省内存减少内存分配、减轻GC压力、加快渲染管线中的Diff过程

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04中使用cmake安装abseil-cpp库

Ubuntu22.04中使用cmake安装abseil-cpp库 关于Abseil库 Abseil 由 Google 的基础 C 和 Python 代码库组成&#xff0c;包括一些正支撑着如 gRPC、Protobuf 和 TensorFlow 等开源项目并一起 “成长” 的库。目前已开源 C 部分&#xff0c;Python 部分将在后续开放。 Abseil …

FreeRTOS项目(序)目录

这章是整个专栏的目录&#xff0c;负责记录这个小项目的开发日志和目录。附带总流程图。 目录 项目简介 专栏目录 开发日志 总流程图 项目简介 本项目基于STM32C8T6核心板和FreeRTOS&#xff0c;实现一些简单的功能。以下为目前已实现的功能。 &#xff08;1&#xff09…

Python 多任务编程:进程、线程与协程全面解析

目录 一、多任务基础&#xff1a;并发与并行 1. 什么是多任务 2. 两种表现形式 二、进程&#xff1a;操作系统资源分配的最小单位 1. 进程的概念 2. 多进程实现多任务 2.1 基础示例&#xff1a;边听音乐边敲代码 2.2 带参数的进程任务 2.3 进程编号与应用注意点 2.3.…

ADSL技术

<摘要> ADSL&#xff08;非对称数字用户线路&#xff09;是一种利用传统电话线实现宽带上网的技术。其核心原理是频率分割&#xff1a;将一根电话线的频带划分为语音、上行数据&#xff08;慢&#xff09;和下行数据&#xff08;快&#xff09;三个独立频道&#xff0c;从…

信号衰减中的分贝到底是怎么回事

问题&#xff1a;在一个低通滤波中&#xff0c;经常会看到一个值-3dB&#xff08;-3分贝&#xff09;&#xff0c;到底是个什么含义&#xff1f; 今天我就来粗浅的讲解这个问题。 在低通滤波器中&#xff0c;我们说的 “截止频率”&#xff08;或叫 - 3dB 点&#xff09;&…

工具分享--IP与域名提取工具2.0

基于原版的基础上新增了一个功能点:IP-A段过滤&#xff0c;可以快速把内网192、170、10或者其它你想要过滤掉的IP-A段轻松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面样式预览&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比

在分布式系统或数据库管理系统中&#xff0c;日志先行原则&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是确保数据一致性、持久性和恢复能力的重要机制。通过 WAL&#xff0c;系统能够在发生故障时恢复数据&#xff0c;保证数据的可靠性。在这篇博客中&#x…

临床研究三千问——临床研究体系的3个维度(8)

在上周的文章中&#xff0c;我们共同探讨了1345-10战策的“临床研究的起点——如何提出一个犀利的临床与科学问题”。问题固然是灵魂&#xff0c;但若没有坚实的骨架与血肉&#xff0c;灵魂便无所依归。今天&#xff0c;我们将深入“1345-10战策”中的“3”&#xff0c;即支撑起…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年9月7日第172弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

万字详解网络编程之socket

一&#xff0c;socket简介1.什么是socketsocket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应用程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程间的通信&#xff0c;这两…

维度跃迁:当万物皆成电路,智能将从“拥有”变为“存在”

我们习以为常的电子世界&#xff0c;其本质是一个由电路构成的精密宇宙。而一场从二维到三维的终极变革&#xff0c;正在悄然酝酿&#xff0c;它将彻底颠覆我们创造和交互的方式。一、电子世界的本质&#xff1a;一切都是电路 在深入未来之前&#xff0c;我们首先要理解当下。电…

大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化

大语言模型(LLM)的性能上限由 “数据质量 数据规模 数据多样性” 共同决定 —— 预训练阶段的海量语料决定模型的泛化能力与语言理解基础,而知识库数据则决定模型的知识准确性与领域专业性。当前 LLM 落地面临的核心痛点之一,便是 “数据脏、处理难、知识杂”:预训练语料…

模拟音频采集设备的制作

模拟音频程序与设备的制作 需要设备 esp32s3 pcm1808 pcm5102(非必须) 程序界面 程序代码 代码链接

Java Modbus通信实战(四):Modbus通信测试与故障排查

在工业现场&#xff0c;设备通信系统就像工厂的神经网络&#xff0c;连接着各种传感器、控制器和执行器。当你搭建好这套系统后&#xff0c;最关键的一步就是全面测试&#xff0c;确保每个环节都能正常工作。 就像汽车出厂前要经过严格的路试一样&#xff0c;Modbus RTU通信系统…

少儿编程C++快速教程之——1. 基础语法和输入输出

1. 欢迎来到C编程世界&#xff01; 1.1 什么是编程&#xff1f; 编程就像是给计算机写一份详细的"说明书"&#xff0c;告诉它该做什么、怎么做。C是一种强大的编程语言&#xff0c;可以用来创建游戏、应用程序和各种有趣的软件&#xff01; 1.2 第一个C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 线性代数库中定义的一个固定大小的 2x2 有符号整数矩阵类型。它主要用于处理小型、维度在编译时已知的整数矩阵&#xff0c;因其在栈上分配内存&#xff0c;故通常比动态矩阵有更高的效率。 下面是一个汇总了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0详解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月发布的一篇论文。虽然站在现在的时间节点&#xff0c;HunYuan3D系列已经出到2.5了&#xff0c;但是1.0版本的改进思路&#xff0c;和它trick集成的做法&#xff0c;还是很值得学习的。由于文章用到了很多技术&#xff0c;由于篇幅有限&a…

踏脚迈入奇幻乐园

每天早上上班的路上都会经过一个小花园。它被夹在丁字路口的拐角&#xff0c;面积不大&#xff0c;匆匆而过的行人都不会注意到它。但如果顺着几个不起眼的入口走进去&#xff0c;里面却是别有洞天。清早的街道还没有车水马龙的喧哗&#xff0c;花园里静悄悄的。各式各样的花草…

内存越界引发线程函数调用堆栈回溯异常以及INT 3软中断实战分析案例分享

目录 1、问题说明 2、导出dump文件时只是遇到了INT 3软中断&#xff0c;并没有发生异常崩溃 3、函数中发生了栈内存越界&#xff0c;导致线程的栈回溯出异常&#xff0c;堆栈中只显示一行函数调用记录 3.1、处理Json数据时产生了异常 3.2、函数中发生栈内存越界&#xff0…

LeetCode 240: 搜索二维矩阵 II - 算法详解(秒懂系列

文章目录LeetCode 240: 搜索二维矩阵 II - 算法详解题目描述Java解决方案算法思路核心理念为什么选择右上角&#xff1f;可视化演示过程示例1&#xff1a;查找 target 5示例2&#xff1a;查找 target 20 (不存在)算法分析时间复杂度空间复杂度算法优势关键要点扩展思考LeetCo…