flutter中final和const有什么不同

发布于 1周前 作者 sinazl 来自 Flutter

Flutter 中 finalconst 的不同

在 Dart 中,finalconst 都用于定义不可变的变量,但它们在使用场景和不可变的特性上有所不同。

1. final

  • 定义后不可变final 变量在定义后只能被赋值一次,但赋值本身可以是延迟的。
  • 运行时初始化final 变量的值在运行时确定。
  • 适用于单次初始化的变量:通常用于那些不需要在编译时就确定值的变量,例如依赖运行时计算或从外部获取的数据。

示例代码

void main() {
  // currentTime 和 age 的值是在运行时决定的,并且在赋值后就不可更改
  final DateTime currentTime = DateTime.now();
  final int age = calculateAge(); // 假设这是一个运行时的计算函数

  print('Current time: $currentTime');
  print('Age: $age');

  // 下面的代码会报错,因为 final 变量只能被赋值一次
  // currentTime = DateTime.now();
  // age = 30;
}

int calculateAge() {
  // 假设的计算逻辑
  return 25;
}

2. const

  • 编译时常量const 变量必须在编译时就确定其值,也就是说,const 变量的值在编译时就固定下来。
  • 不可变对象const 变量不仅自身是不可变的,其引用的对象也是不可变的。
  • 更高的性能:由于 const 变量在编译时就确定了值,它们通常会被 Dart 直接内联到代码中,从而提高性能。
  • 常量构造函数const 可以用于创建编译时的常量对象,使用 const 构造函数来生成不可变的对象实例。

示例代码

void main() {
  // maxItems、pi 和 point 的值在编译时已经确定下来,且不可变
  const int maxItems = 10;
  const double pi = 3.14159;
  const Point point = Point(1, 2);

  print('Max items: $maxItems');
  print('Pi: $pi');
  print('Point: $point');

  // 下面的代码会报错,因为 const 变量必须在编译时确定值,且不可更改
  // maxItems = 20;
  // pi = 3.14;
  // point = Point(3, 4);
}

class Point {
  final int x, y;

  const Point(this.x, this.y);

  @override
  String toString() {
    return '($x, $y)';
  }
}

主要区别

特性 final const
初始化时间 运行时确定 编译时确定
可变性 定义后不可变,但在运行时初始化 定义后不可变,且必须在编译时初始化
是否完全不可变对象 对象本身可变,引用不可变 对象和引用都不可变
适用场景 需要延迟初始化的不可变变量,运行时确定的值 编译时可确定的值和需要完全不可变的对象

总结

  • final:适用于那些不需要在编译时就确定的不可变变量。它可以在运行时赋值,并且只能被赋值一次。
  • const:用于那些在编译时就可以确定的不可变变量和完全不可变的对象。

希望这些信息能帮助你更好地理解 finalconst 在 Dart 和 Flutter 中的使用。


更多关于flutter中final和const有什么不同的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于flutter中final和const有什么不同的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter(以及Dart语言)中,finalconst是两个用于声明变量的关键字,它们各自有不同的用途和行为。虽然它们都用于定义不可变的变量,但在使用场景和生命周期上有所不同。以下是对这两个关键字的详细解释,并附有相关代码示例。

final 关键字

final关键字用于声明一个变量,该变量在初始化后就不能再被重新赋值。final变量的值可以在声明时初始化,也可以在构造函数中初始化(对于类的成员变量)。

示例代码:

void main() {
  // 在声明时初始化final变量
  final int number = 10;
  // number = 20; // 这行会导致编译错误,因为number是final的

  // 类的成员变量使用final
  class Person {
    final String name;
    final int age;

    Person(this.name, this.age);
  }

  Person person = Person("Alice", 30);
  // person.name = "Bob"; // 这行会导致编译错误,因为name是final的
  // person.age = 35; // 这行也会导致编译错误,因为age是final的
}

在上面的代码中,number变量在声明时被初始化为10,之后不能更改。同样,Person类的nameage成员变量在构造函数中被初始化后,也不能再被修改。

const 关键字

const关键字用于声明一个编译时常量,这意味着它的值必须在编译时就确定,并且在整个程序运行期间都不能改变。const变量通常用于定义那些不会改变的值,如数学常数、配置值等。

示例代码:

void main() {
  // 使用const声明编译时常量
  const double pi = 3.14159;
  // pi = 3.14; // 这行会导致编译错误,因为pi是const的

  // const也可以用于定义编译时常量列表或映射
  const List<int> numbers = [1, 2, 3, 4, 5];
  // numbers.add(6); // 这行会导致运行时错误,因为numbers是const的(不可变集合)

  const Map<String, int> ages = {
    "Alice": 30,
    "Bob": 25
  };
  // ages["Charlie"] = 35; // 这行会导致运行时错误,因为ages是const的(不可变映射)
}

在上面的代码中,pi是一个编译时常量,它的值在编译时就确定为3.14159,并且在程序运行期间不能更改。同样,numbersages也是编译时常量,它们分别表示一个不可变的列表和映射。

总结

  • final变量可以在运行时初始化,并且在初始化后不能更改。它适用于那些在构造函数中或初始化块中设置值后不再改变的变量。
  • const变量必须在编译时初始化,并且在整个程序运行期间都不能更改。它适用于那些在整个程序中不会改变的值,如数学常数或配置值。

通过理解finalconst的不同,开发者可以更准确地定义不可变变量,从而提高代码的可读性和可维护性。

回到顶部