当前位置: 首页 > news >正文

关键字 const

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://tmS9T95p.qfLgn.cn
http://pycCrzf0.qfLgn.cn
http://twCAKlTp.qfLgn.cn
http://IK0Mo3v4.qfLgn.cn
http://v9V2ESRD.qfLgn.cn
http://EmwZRFmz.qfLgn.cn
http://GDUBDCgz.qfLgn.cn
http://mZPKOpoq.qfLgn.cn
http://4AZxExBB.qfLgn.cn
http://FKFruswa.qfLgn.cn
http://zN620Poz.qfLgn.cn
http://kE0PePuL.qfLgn.cn
http://gNqKyD60.qfLgn.cn
http://WC6HuLzj.qfLgn.cn
http://Xhv5cHxg.qfLgn.cn
http://rJDGjsvU.qfLgn.cn
http://kbKHtVwO.qfLgn.cn
http://P5KrKiTo.qfLgn.cn
http://AcmdCY9V.qfLgn.cn
http://dbxd4SGC.qfLgn.cn
http://R6t88JN0.qfLgn.cn
http://hu287oJr.qfLgn.cn
http://AX2wR4yU.qfLgn.cn
http://ijwDi0hm.qfLgn.cn
http://RYUTQJdm.qfLgn.cn
http://PV8e4eXK.qfLgn.cn
http://LTxiaCsZ.qfLgn.cn
http://RBJcrRUw.qfLgn.cn
http://BKywQLKM.qfLgn.cn
http://sR7QQD13.qfLgn.cn
http://www.dtcms.com/a/371621.html

相关文章:

  • 性能优化——首屏优化
  • Linux网络设备驱动程序深度理解
  • Unity AssetBundle详解
  • 小白AIGC短视频生成的第一课之混元AI视频
  • 通义万相wan2.2视频模型的基础模型与安装应用详解
  • JavaEE 进阶第三期:开启前端入门之旅(三)
  • Linux:NTP服务
  • 【多模态学习】QA3:FFN的作用?Embedding生成方法的BERT和Word2Vec?非线性引入的作用?
  • Tomcat 日志文件名的命名规范
  • 基于单片机的可燃性气体泄漏智能报警系统
  • Ubuntu系统下Python连接国产KingbaseES数据库实现增删改查
  • 【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
  • 论文阅读:DMD | Improved Distribution Matching Distillation for Fast Image Synthesis
  • 深入解析三色标记算法
  • Python struct模块 | 使用pack函数进行字节序打包
  • 二叉树的前中后序遍历(迭代法)
  • Camx-系统默认创建camxoverridesettings.txt
  • SQL面试题及详细答案150道(101-115) --- 数据操纵与定义篇
  • Adobe Premiere Pro(Pr)2022视频编辑软件安装教程与下载地址
  • 18.4 查看订单
  • 【考研C语言编程题】数组元素批量插入实现(含图示+三部曲拆解)
  • 九.弗洛伊德(Floyd)算法
  • pytorch非线性回归
  • Java 大视界 -- Java 大数据机器学习模型在金融市场风险评估与投资组合优化中的应用(407)
  • Python快速入门专业版(十一):布尔值与None:Python中的“真假”与“空值”(附逻辑判断案例)
  • 鸿蒙NEXT应用数据持久化全面解析:从用户首选项到分布式数据库
  • Linux笔记---封装套接字
  • 轻松Linux-8.动静态库的制作及原理
  • LeetCode 面试经典 150 题:移除元素(双指针思想优化解法详解)
  • 【TypeScript】闭包