Dart关键字完全指南:从基础到高级用法详解
Dart 关键字全面解析:从入门到精通
引言
Dart 作为 Flutter 框架的官方语言,近年来获得了广泛关注。掌握 Dart 的关键字是学习这门语言的基础,本文将全面解析 Dart 的所有关键字,帮助开发者深入理解其用法和最佳实践。
一、变量与常量声明
1. var
- 类型推断声明
var name = 'Dart'; // 自动推断为String类型
var version = 2.12; // 自动推断为double类型
- 声明时必须初始化
- 类型确定后不可更改
2. final
- 运行时常量
final currentTime = DateTime.now(); // 运行时初始化
- 只能赋值一次
- 运行时可确定值
3. const
- 编译时常量
const pi = 3.14159; // 编译时就必须确定值
const list = [1, 2, 3]; // 整个列表不可变
- 值必须是编译时可计算的
- 比
final
有更严格的限制
4. late
- 延迟初始化
late String description; // 声明时不初始化void init() {description = 'Initialized'; // 使用前初始化
}
- Dart 2.12引入
- 用于非空变量的延迟初始化
变量声明对比表
关键字 | 初始化时机 | 是否可变 | 典型用途 |
---|---|---|---|
var | 声明时 | 是 | 局部变量 |
final | 运行时 | 否 | 配置参数 |
const | 编译时 | 否 | 常量定义 |
late | 使用时 | 否 | 依赖注入 |
二、流程控制结构
1. 条件语句
// if-else
if (score >= 90) {grade = 'A';
} else if (score >= 60) {grade = 'B';
} else {grade = 'C';
}// switch-case
switch (command) {case 'START':start();break;case 'STOP':stop();break;default:print('Unknown command');
}
2. 循环结构
// for循环
for (var i = 0; i < 5; i++) {print(i);
}// for-in循环
for (var item in collection) {print(item);
}// while循环
while (!done) {doSomething();
}// do-while循环
do {print('至少执行一次');
} while (false);
3. 循环控制
// break - 跳出整个循环
while (true) {if (condition) break;
}// continue - 跳过当前迭代
for (var i = 0; i < 10; i++) {if (i.isOdd) continue;print(i); // 只打印偶数
}
三、函数与异步编程
1. 基本函数
// 常规函数
int add(int a, int b) {return a + b;
}// 箭头函数(单行)
int multiply(int a, int b) => a * b;
2. 异步处理
// async/await
Future<String> fetchData() async {var data = await http.get('api/data');return processData(data);
}// 错误处理
try {var result = await fetchData();
} catch (e) {print('Error: $e');
} finally {cleanUp();
}
3. 生成器函数
// 同步生成器
Iterable<int> countTo(int n) sync* {for (var i = 1; i <= n; i++) {yield i;}
}// 异步生成器
Stream<int> countDown(int n) async* {for (var i = n; i > 0; i--) {yield i;await Future.delayed(Duration(seconds: 1));}
}
四、面向对象编程
1. 类与继承
class Animal {String name;Animal(this.name); // 构造函数void eat() => print('$name is eating');
}class Dog extends Animal {Dog(String name) : super(name); // 调用父类构造函数void eat() {super.eat(); // 调用父类方法print('...and wagging tail');}
}
2. 接口与混入
// 接口
abstract class Flyable {void fly();
}class Bird implements Flyable {void fly() => print('Flying high');
}// 混入(mixin)
mixin Swimming {void swim() => print('Swimming');
}class Duck extends Animal with Swimming {}
3. 工厂模式
class Logger {final String name;static final _cache = <String, Logger>{};factory Logger(String name) {return _cache.putIfAbsent(name, () => Logger._internal(name));}Logger._internal(this.name);
}
五、高级特性
1. 扩展方法
extension StringExtension on String {String get reversed => split('').reversed.join();int toInt() => int.parse(this);
}void main() {print('123'.reversed); // '321'print('42'.toInt()); // 42
}
2. 类型定义
typedef JsonMapper = Map<String, dynamic> Function(String json);JsonMapper parser = (json) => jsonDecode(json);
3. 空安全
String? nullableString = maybeGetString(); // 可能为nullif (nullableString != null) {print(nullableString.length); // 安全访问
}// 空断言操作符
print(nullableString!.length); // 开发者确保不为null
最佳实践
- 优先使用final:除非需要修改变量,否则使用
final
- 合理使用const:能使用
const
的地方尽量使用 - 避免dynamic:除非必要,否则不要使用
dynamic
- 善用late:明确延迟初始化的变量使用
late
- 类型安全:尽可能指定明确类型而非使用
var
- 异步处理:优先使用
async/await
而非Future.then
结语
掌握 Dart 关键字是成为高效 Dart 开发者的第一步。本文涵盖了 Dart 的主要关键字及其用法,建议读者在实际开发中多加练习,逐步深入理解这些关键字的精髓。随着 Dart 语言的不断发展,新的特性也会不断加入,保持学习才能跟上技术发展的步伐。
希望这篇指南能帮助你在 Dart 开发之路上走得更远!