一.背景
最近看rollbar_flutter | Flutter Package源码发现有类似Class.new
写法,查了下相关用法,总结下构造函数拆分的知识点。
二. 实例代码
class User {
User();
final String name = "MisterX";
final String email = "misterx@gmail.com";
}
void main() {
//-----------
//这里User.new不是很明白
//-----------
const x = User.new;
final z = x();
print(z.email);
}
三. 函数拆分
可以使用函数名称创建一个函数对象,该对象指向另外一个对象的函数。如下示例中
- m.greet函数创建了一个函数对象g;
- g指向了另外一个函数forEach的入参函数。
class Greeter {
final String name;
Greeter(this.name);
void greet(String who) {
print('$name says: Hello $who!');
}
}
void main() {
final m = Greeter('Michael');
final g = m.greet;
g('Leaf');
print('========1=========');
['Lasse', 'Bob', 'Erik'].forEach(m.greet);
}
四. 构造函数拆分(也称为构造函数指针)
.new is a way to pass a reference to the constructor. It doesn't create a new class. It's just the same default constructor of the class. This is also called a constructor tear-off. It was introduced in Dart 2.15.
解读:
- .new是类的方法,不是对象方法。
- 不会创建新类。
- 返回值是类的构造函数, 注意是函数。
- Dart2.15 引入。
五. 应用
1. Flutter中简洁快速构建控件
class FruitWidget extends StatelessWidget {
const FruitWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: ['Apple', 'Orange'].map(Text.new).toList());
}
}