Appearance
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.