Dart基础之Final 和 Const

使用过程中从来不会被修改的变量, 可以使用 finalconst, 而不是 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 关键字即可修饰变量也可用来修饰 常量构造函数

你可能感兴趣的:(Dart基础之Final 和 Const)