使用过程中从来不会被修改的变量, 可以使用 final
或 const
, 而不是 var
或者其他类型。
1. const 、final 使用场景
1. final
final
用来修饰变量 只能被赋值一次,在运行时赋值,所谓运行时 就是当程序执行到这块代码时才会对final 修饰的变量进行赋值。
- 当
final
使用在类中时,在声明变量时,你必须对其初始化赋值:
错误写法:
class testPage{
final String title;//error:The final variable 'title' must be initialized.Try initializing the variable.
void test(){
title = "页面";//error:'title' can't be used as a setter because it's final.Try finding a different setter, or making 'title' non-final
}
}
正确写法:
class testPage{
final String title = "页面";
void test(){
}
}
- 当
final
运用在StatefulWidget
中时,用来修饰变量时:
class TestPage extends StatefulWidget {
final String title;
TestPage({this.title});
@override
_TestPageState createState() => _TestPageState();
}
这种情况使用 final
修饰的变量看似没有进行初始化赋值,但是不违背 final
修饰的变量在运行时赋值的理解,因为只有当定义的 StatefulWidget
被初始化使用时,这里 final
修饰的变量才会被赋值,当然也是赋值一次。
2. const
const
可用来修饰变量、修饰常量构造函数,修饰的变量只可被赋值一次。
const
可用来修饰的变量只可赋值一次,const
修饰的变量会在编译器以至于应用整个生命周期内都是不可变的常量,在内存中也只会创建一次,之后的每次调用都会复用第一次创建的对象。
///全局常量 声明
const String name = "张三";
class TestPage2 {
///类常量 规范要求必须使用 static 修饰
static const String name = "张三";
void test(){
///方法块常量
const String name = "张三";
}
}
const
可用来修饰常量构造函数
class testPage{
final String title;
const testPage({this.title});
}
2. final 与 const 的不同点
1.final 与 const 修饰的变量取值时机不同
所谓取值时机不同,指的是 const
修饰的变量是在编译时已确定下来的值,而 final
修饰的变量是在运行时才确定下来的。
const
修饰的变量是在编译期,程序运行前就有确定值。
使用 const
修饰的常量的值,必须由可在编译时可计算出结果的。 对于在运行时需要获取的值是不可修饰的.
class testPage{
final age = 18;
///DateTime.now() 需要在运行时才能获取值
final date1 = DateTime.now();
static const name = "Dav";
static const date2 = DateTime.now();//error:Const variables must be initialized with a constant value
}
2.应用范畴不同
final
只可用来修饰变量,const
关键字即可修饰变量也可用来修饰 常量构造函数
网友评论