关于 dart-modern-syntax
面向 Dart 开发者的现代 Dart 3.x 语法参考技能,通过示例讲解较新的语言结构,也介绍了 Dart 3.12 的实验性主构造函数。
主要功能
- 01讲解私有命名参数
- 02介绍零开销扩展类型
- 03展示未使用元素的通配符
- 04演示记录与模式匹配
- 05介绍实验性主构造函数
适用场景
- 01在代码中采用较新的 Dart 语法
- 02用扩展类型包装领域值
- 03解构记录和对象
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill dart-modern-syntax安装后在 Claude Code 中输入/dart-modern-syntax确认已加载。
详细介绍
现代 Dart 语法(Dart 3.0 - 3.12+)
使用 Dart 3.x 引入的最新语法特性,编写简洁、精炼、类型安全且高度优化的代码。
目录
私有命名参数
Dart 3.12 引入
Dart 现在支持使用构造函数中的命名参数直接初始化私有字段。这样就无需在初始化列表中手动赋值。
用法
- 声明命名构造函数参数时,在私有字段名前加上
this.: - 编译器会在调用处自动去掉前导下划线(
_)。
class User {
final String _name;
final int _age;
// Initializing private fields directly
User({
required String this._name,
required int this._age,
});
String get name => _name;
int get age => _age;
}
void main() {
// Call site does NOT include the underscore
final user = User(name: 'Alice', age: 30);
print(user.name); // Alice
}
扩展类型
Dart 3.3 引入
扩展类型是在编译时使用的包装类,其底层表示类型是另一种类型。它们提供零成本抽象,也就是说,与标准类不同,它们在运行时不会在内存中分配包装对象。
规则与模式
- 为现有类型公开新接口,无需承担运行时分配开销。
- 使用
extension type Name(RepresentationType value)声明。 - 适用于设计对性能敏感的 API、特定领域的 ID 包装类型,或包装 JS 互操作对象。
// Exposes a zero-cost wrapper around an integer
extension type Id(int value) {
// Add custom helper methods
bool get isValid => value > 0;
}
// Wrapping a list to restrict available methods
extension type IntList(List<int> list) {
int get head => list.first;
void printSummary() {
print('Length: ${list.length}, Head: $head');
}
}
void main() {
final myId = Id(42); // Zero overhead, compiled directly to 42
print(myId.isValid); // true
}
未使用元素的通配符
Dart 3.7 引入
可以使用通配符 _ 表示未使用的元素。这样可以避免 linter 警告,并清楚地向其他开发者(以及 AI Agent)表明某个变量或导入是有意忽略的。
通配符作用域
- 未使用的参数:在回调中使用
_(嵌套时可使用__、___)。 - 未使用的局部变量:如果变量仅用于触发副作用,可将其声明为
_。 - 未使用的导入:将包导入为
_,以运行其初始化逻辑而不绑定名称。
import 'package:init_library/init.dart' as _;
void processItems() {
final items = ['apple', 'banana', 'orange'];
// Wildcards in list mapping
final indexed = items.mapIndexed((index, _) => 'Item $index');
// Wildcard for unused exception variable
try {
performDangerousTask();
} catch (_) {
print('Failed to perform task.');
}
}
记录和模式匹配
Dart 3.0 引入
记录可以在不编写自定义类样板代码的情况下,让函数返回多个值。模式匹配可以提取这些值,或简洁地解构对象。
语法最佳实践
- 位置记录:
(double, double) getCoordinates() => (37.77, -122.41); - 命名记录:
({String name, int age}) getDetails() => (name: 'Bob', age: 25); - 解构:直接赋值给匹配的结构:
// 1. Positional Record Destructuring
final (lat, lng) = getCoordinates();
// 2. Named Record Destructuring
final (name: userName, age: userAge) = getDetails();
// 3. Object Destructuring with Patterns
if (user case User(name: final name, age: > 18)) {
print('$name is an adult');
}
主构造函数
Dart 3.12 引入(实验性)
主构造函数提供了一种简洁的语法,可定义带有自动字段声明和赋值的类,类似于其他现代语言。
// Shorthand for immutable data structures
class Point(int x, int y);
// Equivalent to:
// class Point {
// final int x;
// final int y;
// Point(this.x, this.y);
// }
评论
支持 Markdown