const
使用const 定义的常量是不可变的, 需要定义并赋值,常量定义的集合,都是只读的,特性是所赋值会传递到子元素,在内存中会复用相同内容对象,const特性与ES6中的类似
- const PI = 3.1454567;
- const ARY = [1,2,3,4,5];
- var ARRY = const[1,2,3,5];
final
使用final 定义的变量, 只能赋值一次;并且在运行时赋值,所谓运行时,就是当程序执行到这块代码时才会对final修饰的变量进行赋值。可以是对象、字符串、数字等
final SCORE = 123;
java中定义常量:
final static float DEX = 0.5;
如果常量定义的是基本数据类型(int、double),在dart中不需要定义变量的类型,dart会根据赋值的情况推导类型,如果加上var就会报错。
- const a = [1,2,3,4,5];
- a[1] = 10;
- print(a[1]);
如上代码运行会直接报错。上面一中说到赋值会传递到子元素,就是指这个。而final,修饰的则可以直接修改。
Unhandled exception: Unsupported operation: Cannot modify an unmodifiable list #0 UnmodifiableListMixin.[]= (dart:_internal/list.dart:90:5) #1 main (package:flutter_demo/dartEx.dart:39:4) #2 _startIsolate.(dart:isolate-patch/isolate_patch.dart:301:19) #3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
- const a = [1,2,3,4];
- var b = const[1,2,3,4];
- print(identical(a, b)); //true
-
-
- const a = [1,2,3,4];
- const b = [1,2,3,4];
- print(identical(a, b)); //true
const和final在dart中不可以修饰类
const和final声明的类型均可省略
const和final初始化不能再赋值
const和final都不能和var同时使用
类级别的常量使用static const
创建相同的const对象在内存中会被共用
const的不变性是可传递的(传递至集合的子元素),而final则不会
const常量需要使用const常量进行定义,比如如下方式就不可

用var定义的const数组是可以重新赋值,而const和final定义的就不行,如下:

const定义时,必须是编译时常量,比如const datetime = DateTime.now();这么写就会报错
使用const定义一个数组时,后面的const可以省略,比如
const a = const[1,2,3]; const b = [1,2,3];