mcpField
D
dart-modern-syntax

dart-modern-syntax

github.com/dhruvanbhalara开发3042 次安装8 周前更新
代码仓库

关于 dart-modern-syntax

面向 Dart 开发者的现代 Dart 3.x 语法参考技能,通过示例讲解较新的语言结构,也介绍了 Dart 3.12 的实验性主构造函数。

主要功能

  1. 01讲解私有命名参数
  2. 02介绍零开销扩展类型
  3. 03展示未使用元素的通配符
  4. 04演示记录与模式匹配
  5. 05介绍实验性主构造函数

适用场景

  1. 01在代码中采用较新的 Dart 语法
  2. 02用扩展类型包装领域值
  3. 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