在Flutter中final和const的区别
首先在说这个问题之前,可以先看一段代码:
main() {
// 同时赋值已经确定好的值const和final是没有区别的
const con = '2020-09-01';
final nal = '2020-09-01';
// 赋予不确定的值const和final就不一样了
// const 在编译的时候值都必须是确定的
const _date = new DateTime.now(); //错误的, 会报错
// final是在运行的时候才赋值
final _date1 = new DateTime.now(); //正确的, 不会报错
}
使用final
修饰的变量必须进行初始化,一旦被赋值以后,不能被再次赋值,但是这个初始化的值在编译时是不确定的,只有在运行时,才能确定其值
例如Flutter官方教程中,有这么一行代码:
final wordPair = WordPair.random();
const
定义时,需要是个明确的值,修饰的变量它会在编译器以至于应用整个生命周期内都是不可变的常量,在内存中也只会创建一次,之后的每次调用都会复用第一次创建的对象。例如:
每次调用都会复用第一次创建的对象。例如:
main() {
foo();
}
foo() {
const _city = "西安";
var list = const[1,2,3,4,5];
var point = const User("XiaoMing", 17);
const num = 1+2;
const time = DateTime.now();//错误用法 这样会报错
}
class User {
final String userName;
final int age;
const User(this.userName, this.age);
}
const
导致的不可变特性是可以传递的。如果有一个final
修饰的成员变量,这个成员变量包含了一个集合,那么这个集合仍然是可变的, 但是如果包含的是const
修饰的集合,那么集合内所有东西都是递归不可变的。例如:
main() {
final list0 = [1,2,3];
list0[0] = 4;
print(list0.toString());//打印[4,2,3]
var list1 = const[1,2,3];
list1[0] = 4;//这里会报错
}
扩展:static
修饰符也能用来修饰变量, 被它修饰的成员变量,方法是属于类级别的, 并不属于对象。static变量直到运行期使用时才会进行实例化。