一件代发48个货源网站,WordPress下级,wordpress固定链接,上传图片的网站要怎么做const keyword
首先需要知道 const 和 final 是对立关系, 都是用来声明常量的
在 Flutter#xff08;Dart 语言#xff09; 中#xff0c;const 是一个编译时常量关键字#xff0c;其作用不仅是声明不可变变量#xff0c;还能在内存和性能优化中发挥关键作用。 #x1…const keyword
首先需要知道 const 和 final 是对立关系, 都是用来声明常量的
在 FlutterDart 语言 中const 是一个编译时常量关键字其作用不仅是声明不可变变量还能在内存和性能优化中发挥关键作用。 核心作用
1️⃣ 编译时确定的值
const 修饰的变量或对象必须在编译时就能计算出结果无法依赖运行时的数据。示例const PI 3.14159; // ✅ 合法
const currentTime DateTime.now(); // ❌ 非法运行时才能确定2️⃣ 深度不可变
变量本身和所有嵌套属性不可变const list [1, 2, 3];
list.add(4); // ❌ 运行时抛出异常3️⃣ 内存优化
相同值的 const 对象共享同一内存地址var a const [1, 2];
var b const [1, 2];
print(identical(a, b)); // ✅ 输出 true内存地址相同✨ 在 Flutter 中的应用场景 1. 提高 Widget 性能
Flutter 会跳过重建 const Widget因其不可变
// 推荐写法对静态无状态的子 Widget 使用 const
class MyPage extends StatelessWidget {overrideWidget build(BuildContext context) {return Column(children: [const Text(Hello), // ✅ 重建时会被复用const SizedBox(height: 10),],);}
}2. 定义全局常量
跨组件共享的配置const kDefaultPadding 16.0;
const kPrimaryColor Color(0xFF4285F4);3. 优化集合类型
使用 const 创建不可变集合const validStatusCodes {200, 304}; // 不可变的 Set
const translations {en: Hello, es: Hola}; // 不可变的 Map⚠️ 与 final 的关键区别
特性constfinal赋值时机编译时运行时但只赋值一次内存占用共享相同值每次创建新实例集合内部可变性完全不可变递归变量引用不可变但对象内部可修改
示例对比
// const完全冻结
const constList [1, 2];
// constList.add(3); // ❌ 报错// final仅禁止重新赋值
final finalList [1, 2];
finalList.add(3); // ✅ 允许修改内容
// finalList [4, 5]; // ❌ 禁止重新赋值最佳实践 Widget 优化 // ✅ 好的写法尽可能对静态子 Widget 使用 const
Scaffold(body: const Center(child: const Text(优化性能),),
);// ❌ 避免无谓的重复构建
Scaffold(body: Center(child: Text(每次重建), // 非 const 导致重复创建),
);集合常量 // 使用 const 构造器创建不可变集合
var list const []; // 等同于 List.unmodifiable([])构造函数标记 // 如果类可能被 const 构造显式声明 const 构造函数
class Point {final double x, y;const Point(this.x, this.y); // ▶️ 可被 const 调用
}性能影响实测
以下代码在 Flutter 性能测试 中差异明显
// 测试1非 const Widget构建耗时较长
ListView.builder(itemBuilder: (_, index) Text(Item $index),
);// 测试2const Widget构建速度提升 20%-40%
ListView.builder(itemBuilder: (_, index) const Text(Item),
);❗ 常见误区
误区1认为 const 只在编译期有用 → 实际在运行时也会优化内存共享实例。误区2滥用 const 导致代码可读性下降 → 权衡可维护性和性能避免过度优化。 通过合理使用 const可以显著提升 Flutter 应用的性能和内存效率尤其是在复杂 Widget 树场景下。
番外static 是否需要
在 Dart/Flutter 中为类定义静态常量时推荐使用 static const而非仅用 static。以下是详细对比和最佳实践 核心区别对比
特性static const intstatic int (非 const)不可变性✅ 编译时常量完全不可变❌ 变量可被重新赋值即使不推荐内存优化✅ 全局共享同一内存地址❌ 每次访问都是独立值使用场景定义真正的常量如配置、枚举值需要运行时修改的静态变量线程安全✅ 天然线程安全❌ 需手动控制同步 为什么推荐 static const
1️⃣ 语义明确
static const 清晰表达“这是不可变的常量”class Config {static const int maxRetryCount 3; // ✅ 明确表示不可修改static int timeout 5000; // ❓ 可能被意外修改易引发 bug
}2️⃣ 性能优势
const 常量在编译时被内联运行时无额外内存开销// 编译后直接替换为字面量
print(Config.maxRetryCount); // 等效于 print(3);3️⃣ 避免意外修改
非 const 的 static 变量可能被错误地修改Config.timeout -1; // 编译通过但逻辑错误
Config.maxRetryCount 5; // ❌ 编译时报错安全使用建议
✅ 优先 static const 的场景
枚举值、状态码、配置参数等绝对常量class HttpStatus {static const int success 200;static const int notFound 404;
}⚠️ 谨慎使用 static int无 const的场景
需要在运行时动态调整的全局变量如缓存大小class AppCache {static int maxSize 100; // 允许运行时修改static void updateCacheSize(int size) maxSize size;
}实际代码示例
1. 定义路由名称常量推荐 const
class AppRoutes {static const String home /home;static const String profile /profile;
}// 使用时直接内联无运行时开销
Navigator.pushNamed(context, AppRoutes.home);2. 需要运行时修改的计数器用非 const
class Counter {static int globalCount 0; // 需要修改不能用 conststatic void increment() globalCount;
}⚠️ 常见问题
Qstatic final 和 static const 如何选
相同点均不可变不同点 const必须编译时确定值如数字、字符串字面量final允许运行时赋值一次如从函数计算结果 class MathConstants {static const double pi 3.14159; // ✅ 编译时已知static final double random Random().nextDouble(); // 运行时确定
}Q为什么 Dart 不默认所有 static 为 const
设计哲学显式声明优于隐式行为避免开发者误用常量导致灵活性丧失。 性能对比测试
// 测试代码重复访问 10 万次
class Test {static const int constValue 42;static int mutableValue 42;
}void benchmark() {final stopwatch Stopwatch()..start();for (var i 0; i 100000; i) {Test.constValue; // 0.2ms (编译时内联)}print(const: ${stopwatch.elapsedMicroseconds}μs);stopwatch.reset();for (var i 0; i 100000; i) {Test.mutableValue; // 1.8ms (需内存访问)}print(non-const: ${stopwatch.elapsedMicroseconds}μs);
}结果const 访问速度快 5-10 倍实际差异随场景变化。 ✅ 终极总结
关键字推荐场景static const绝对常量配置、枚举、数学常数等static final运行时确定但不可变的量如初始化后的全局配置static需要运行时修改的静态变量慎用确保线程安全或加锁
黄金法则 能用 const 就优先用 const除非必须允许修改。 番外2自动类型判断
class Square {static int sides 4;
}class Circle {// 这里其实dart规范写成 pi 就行/*可以加上 double但是不加也是可以正常运行的上面的 sides 不带 const 所以需要带上 int*/static const PI 3.14;
}在 Dart 中static const 和 static 变量在类型推断上的行为差异源于 Dart 的类型系统设计 和 const 常量的特殊性。以下是具体原因和背后机制 根本原因
1️⃣ const 常量的类型推断规则
const 声明的常量 拥有 更强大的类型推断能力 Dart 编译器在处理 const 时会 根据右侧的初始值自动推断类型因此允许省略类型声明。static const PI 3.14; // 自动推断为 double 类型
static const name Flutter; // 自动推断为 String 类型因为 const 的值必须在编译时确定编译器可以安全地推断出类型。
2️⃣ 非 const 静态变量的限制
普通的 static 变量 默认不会自动推断类型即类型是可选的但如果不初始化必须指定类型 Dart 要求静态变量 要么有类型注解要么有初始值以便推断类型static int sides 4; // ✅ 明确指定类型推荐
static sides 4; // ✅ 也行编译器推断为 int
static int sides; // ❌ 不初始化时必须指定类型否则 dynamic⚠️ 关键点 如果省略 int它依然是 100% 合法的 Dart 代码Dart 2.x 开始支持局部变量类型推断。但某些代码风格工具如 lints 规则或 IDE 可能会 建议显式声明类型以避免隐式 dynamic 或提高代码可读性。 Dart 官方风格指南的建议
✅ 推荐做法 对于 const 常量 可省略类型代码更简洁Dart SDK 也大量使用该风格static const defaultTimeout 1000; // 推断为 int对于 static 可变变量 更推荐显式声明类型提高可读性和维护性static int maxConnections 10; // 而不仅是 static maxConnections 10;final 变量的场景 static final 变量也会自动推断类型static final currentTime DateTime.now(); // 自动推断为 DateTime底层机制
为什么 const 可以省略类型 编译时常量的特性 在编译期间任何 const 表达式都会被计算并内联到代码中Dart 能 100% 确定其类型。 避免 dynamic 风险 因为 const 值无法修改类型推断是绝对安全的。
为什么非 const 静态变量建议显式类型 降低 dynamic 的意外使用 如果没有初始化或类型注解Dart 会推断为 dynamic可能引发运行时错误static var uninitialized; // 类型是 dynamic危险代码可维护性 显式类型让代码意图更清晰方便团队协作。 代码示例
✅ 正确且推荐
class Math {static const PI 3.14; // 推断为 double
}➡️ 编译后完全等同于
static const double PI 3.14;总结
场景类型声明建议示例static const可省略自动推断static const PI 3.14;static 变量推荐显式声明避免隐含 dynamicstatic int sides 4;final 变量可省略static final now DateTime.now();
黄金法则
对于常量const/final → 类型可省代码更简洁。 * 当 类型不够明显、需要特定的类型、代码可读性需要建议 显示写明类型对于可变静态变量 → 显式声明类型提高健壮性。