Dot shorthands(点简写)

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注