Skip to content

const构造函数

在过去的版本中,Flutter lint并不会检查const structor的规范使用,所以有必要告诉大家,在组件中使用const structor。Dart支持使用const构造函数来创建不可变的对象。const构造函数用于创建在编译时确定的不可变对象,而不是在运行时通过构造函数创建对象。使用const构造函数可以提高性能和效率,并且可以在适当的场景下进行一些静态的优化。
而现在的版本中,如果你调用一个Flutter内置的组件,没有使用const构造函数,Flutter lint会提示下面的内容,所以,你需要使用const构造函数。

Use 'const' with the constructor to improve performance.
Try adding the 'const' keyword to the constructor invocation.

如何申明一个const构造函数?

非常简单,要声明const构造函数,需要在类的构造函数前加上const关键字。比如:

dart
class Point {
  final double x;
  final double y;
  
  const Point(this.x, this.y);
}

void main() {
  const p1 = Point(0, 0);  // 使用const关键字创建不可变的Point对象
  const p2 = Point(1, 1);  // 使用const关键字创建不可变的Point对象
  // const对象可以在编译时就确定,所以后续的创建等操作只是引用同一个实例
  
  print(identical(p1, p2)); // 输出:true, 两个对象是同一个实例
}

上面的示例中,const Point声明了一个不可变的Point类,参数在构造函数中标记为final,表示它们是只读的。然后,我们使用const关键字创建了两个不可变的Point对象。注意,由于这些对象是在编译时就确定的,因此后续创建相同对象的操作只是引用了同一个实例。

需要注意的是,const构造函数有一些限制条件,例如所有参数都必须是不可变的(使用final或const修饰),构造函数体必须是可执行的,且不能有副作用。此外,在使用const构造函数创建对象时,参数也必须是编译时常量。

使用const构造函数来创建不可变的对象可以提高性能和内存效率,尤其在需要创建大量相同的不可变对象时。它还可以在编译时进行一些优化,并避免运行时的对象创建。但需要注意,const构造函数适用于确定不会改变的对象,如果对象需要在运行时进行修改,则需要使用普通的构造函数。

组件中的const构造函数

组件中的const构造函数,可以提高组件的渲染性能和效率。这是因为在组件的构造函数中,通常会包含一些初始化操作,这些操作在每次组件渲染时都会执行。而如果使用const构造函数,则可以在编译时进行优化,避免每次渲染时都执行这些初始化操作。最关键的可以提高性能和内存效率。随着组件的不断增多,这样的优化收效将越发明显。

dart
class MyWidget extends StatelessWidget {
  const MyWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

什么情况下无法使用

前面已经说到,const 构造函数只能在编译时确定,所以,如果参数不是编译时常量,则无法使用const构造函数。如果一个类,需要传入参数(没有默认参数)才能运行,那么这种情况下只能将组件拆分为最小单元时,尽可能在子组件中使用const构造函数。

dart
class PersonA{
  final String name;

  const Person({this.name = "Bob"});
}

class PersonB{
  final String name;

  const Person({required this.name});
}

/// PersonB中的name,非可选
final PersonA personA = const PersonA();
final PersonB personB = PersonB(name: "Alice");

哪些组件可以使用

Flutter自带的组件目前绝大多数都能使用,如果你的lint没有做出提示,确保prefer_const_constructors没有被设置为ignore
检查analysis_options中linter是否开启这个选项

yml
include: package:flutter_lints/flutter.yaml
  linter:
    rules:
      - prefer_const_constructors

这样一来当你使用组件而未准确使用const 构造函数时,lint就会提示你。

dart
Center(child: Text("center"),); /// 将被提示:Use 'const' with the constructor to improve performance.

const Center(child: Text("center"),); /// 不会被提示

const Center(child: const Text("center"),); /// Unnecessary 'const' keyword.

仅用于培训和测试,通过使用本站代码内容随之而来的风险与本站无关。版权所有,未经授权请勿转载,保留一切权利。
ICP备案号:滇ICP备15009214号-13   公安网备:滇公网安备 53312302000061号