.foo 点简写语法可以省略类型名,只要编译器能从上下文推断出目标类型,写出更简洁的 Dart 代码。 访问枚举值、静态成员、构造函数时,不必完整书写 类型.foo。
简单来说:点简写允许表达式以以下形式开头,并且后面可以链式调用其它操作:
- 标识符
.myValue - 构造函数
.new() - 常量创建
const .myValue()
例子
enum Status { none, running, stopped, paused }
class Point {
final int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0;
}
void main() {
// 命名构造简写
Point origin = .origin(); // 等价 Point.origin()
// 枚举简写
Status currentStatus = .running; // 等价 Status.running
// 静态方法简写
int port = .parse('8080'); // 等价 int.parse('8080')
}Code language: Dart (dart)
上下文类型(Context type)
点简写依靠上下文类型让编译器推断对应的类型成员。
上下文类型:根据表达式所在位置,Dart 期望此处拥有的类型。
例:Status currentStatus = .running
编译器知道变量需要 Status 类型,因此把 .running 解析为 Status.running。
词法结构与语法
静态成员简写是以 . 开头的表达式。当上下文能确定类型时,可简写访问:静态成员、构造函数、枚举常量。
适用场景
1. 枚举
赋值、switch 匹配时枚举类型十分明确,非常适合简写:
enum LogLevel { debug, info, warning, error }
String colorCode(LogLevel level) {
return switch (level) {
.debug => 'gray',
.info => 'blue',
.warning => 'orange',
.error => 'red',
};
}
void main() {
// 调用
String warnColor = colorCode(.warning); //自动识别出是LogLevel.warning
}Code language: Dart (dart)
2. 具名构造 / 工厂构造
支持泛型类构造函数传类型参数:
class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0, y = 0;
factory Point.fromList(List<double> list) => Point(list[0], list[1]);
}
void main() {
Point origin = .origin();
Point p1 = .fromList([1.0, 2.0]);
// 泛型类
List<int> intList = .filled(5, 0); // List.filled(5,0)
}Code language: Dart (dart)
3. 无参构造 .new
.new 简写调用类的默认无名构造,适合状态类大量初始化字段,自动推断泛型参数:
// 简写前
late final AnimationController _animationController = AnimationController(vsync: this);
final ScrollController _scrollController = ScrollController();
// 简写后
late final AnimationController _animationController = .new(vsync: this);
final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();
Map<String, Map<String, bool>> properties = .new();Code language: Dart (dart)
4 静态成员(静态方法、静态字段)
int httpPort = .parse('80'); // int.parse('80')
BigInt bigIntZero = .zero; // BigInt.zeroCode language: Dart (dart)
5 常量表达式
常量上下文下,只要目标成员是编译期常量就可以使用简写:
enum Status { none, running }
class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0.0, y = 0.0;
}
const Status defaultStatus = .running;
const Point myOrigin = .origin();
const List<Point> keyPoints = [.origin(), .new(1.0, 1.0)];Code language: Dart (dart)
链式调用
可以在简写后链式调用实例方法 / 属性;编译器先用上下文解析简写目标,后续链式调用返回值需要兼容类型:
String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // hCode language: JavaScript (javascript)
void main() {
String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // h
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
h
Code language: CSS (css)
Previous: 枚举
Next: 扩展方法(Extension methods)