本文针对具备 Kotlin / Android 开发背景的同学,剔除琐碎细节与纯理论,聚焦 Dart 2.18 → Dart 3.x 在 Flutter 开发中最核心、最高频的现代语法特性与差异对照。
一、Kotlin 与 Dart 核心语法映射表
| 场景 / 概念 | Kotlin | Dart |
|---|---|---|
| 可变变量 | var a = 1 |
var a = 1; |
| 只读引用(运行时) | val a = compute() |
final a = compute(); |
| 编译期常量 | const val A = 1 |
const a = 1; |
| 延迟初始化 | lateinit var a: String |
late String a; / late final a = ... |
| 可空类型 | String? |
String? |
| 安全调用 | user?.name |
user?.name |
| 空值合并 / 默认值 | name ?: "Unknown" |
name ?? 'Unknown' |
| 空值赋值 | if (a == null) a = b |
a ??= b; |
| 非空断言 | name!! |
name! |
| 作用域变换 / 级联 | obj.apply { ... } |
obj..foo()..bar(); |
| Lambda / 箭头函数 | { x -> x * 2 } |
(x) => x * 2 |
| 必填命名参数 | 构造器/函数命名调用 | {required String name} |
| 构造器参数自动绑定 | class User(val name: String) |
User(this.name); |
| 继承父类参数透传 | class Button(key: Key) : View(key) |
Button({super.key}); |
| 接口声明 | interface Repository |
abstract interface class Repository (Dart 3) |
| 密封类 | sealed class UiState |
sealed class UiState (Dart 3) |
| 条件分支表达式 | val x = when(state) { ... } |
final x = switch(state) { ... }; (Dart 3) |
| 匿名数据结构 / 元组 | Pair("A", 1) |
Record: ('A', 1) (Dart 3) |
| 解构匹配 | val (name, age) = user |
final (name, age) = user; (Dart 3) |
| 集合过滤 | list.filter { it > 0 } |
list.where((x) => x > 0).toList() |
| 集合展开 | val all = a + b |
[...a, ...b] |
| 异步单值 | suspend fun load(): String |
Future<String> load() async |
| 异步事件流 | Flow<Int> / flow { emit(1) } |
Stream<int> / async* { yield 1; } |
| 单例 / 伴生对象 | object / companion object |
Top-level 顶层成员 / static / factory |
| 扩展函数 / 属性 | val String.isEmail: Boolean |
extension on String { bool get isEmail => ...; } |
二、变量声明:var / final / const / late
1 | // 1. var: 类型自动推断,变量可重新赋值 |
注意:Flutter 中 Widget 属性若全部为
const,框架会复用编译期对象,避免频繁重绘。
三、空安全与运算符
Dart 默认开启健全空安全(Sound Null Safety):
1 | String? nullableStr; // 允许为 null |
四、函数与 Flutter 参数风格
Dart 语法深度适配了 Flutter 嵌套组件树的设计:
1. 命名参数与必选标记 required
1 | // 使用 {} 包裹即为命名参数,配合 required 实现严格约束 |
2. 回调函数与级联操作符 ..
1 | // VoidCallback 对应 Kotlin 的 () -> Unit |
五、面向对象与现代化类设计
1. 构造函数简化与 super.key
1 | class UserWidget extends StatelessWidget { |
2. 命名构造函数与 factory
1 | class User { |
3. 私有作用域、Mixin 与接口修饰符(Dart 3)
- 私有标识:变量或方法前加下划线
_name,其私有范围是 文件/Library 级(而非仅仅 Class 内)。 - **
mixin**:实现跨类行为复用(class Controller with LogMixin {})。 - **
abstract interface class**:明确声明纯接口契约。 - **
extension**:扩展函数/Getter:1
2
3extension StringExt on String {
bool get isEmail => contains('@');
}
六、集合与内嵌语法(Collection if / for / spread)
这是 Flutter 声明式 UI 编程的核心利器:
1 | final bool isLoggedIn = true; |
常见集合流式 API 与 Kotlin 对照
1 | // 过滤:where 对应 Kotlin 的 filter |
七、Dart 3 核心:Record、Pattern 与 Switch 表达式
Dart 3 引入了完整的模式匹配与元组支持,极大地重构了状态管理逻辑。
1. 记录(Record):轻量级匿名数据返回
1 | // 多返回值无需专门定义 DTO Class,支持位置与命名参数 |
2. sealed class 配合 switch 表达式建模 UI 状态
类似 Kotlin 的 Sealed Class + when:
1 | // 1. 定义密封类状态 |
八、异步编程:Future 与 Stream
| 概念 | 核心语法 | 对齐 Kotlin |
|---|---|---|
| 单次异步任务 | Future<T> + async / await |
suspend fun 挂起函数 |
| 异步并发执行 | await Future.wait([taskA(), taskB()]) |
coroutineScope { awaitAll(...) } |
| 异步事件流 | Stream<T> + async* / yield |
Flow<T> + flow { emit(...) } |
| 消费事件流 | await for (final item in stream) |
flow.collect { item -> ... } |
1 | // 1. Future 异步请求与错误重抛 |