1. Dart语言概述
Dart是一种由Google开发的面向对象编程语言,最初于2011年推出,旨在为现代Web开发提供结构化但灵活的解决方案。作为Flutter框架的官方语言,Dart近年来在跨平台移动应用开发领域获得了广泛关注。它的语法融合了Java、JavaScript和C#等语言的特性,同时加入了独特的现代化功能。
Dart的设计哲学强调"开发效率"和"执行性能"的平衡。它既支持即时编译(JIT)用于快速开发周期,也支持提前编译(AOT)以生成高性能的本地代码。这种双重特性使Dart特别适合从开发到生产的全流程需求。
最新稳定版本为Dart 3.4.1(对应Flutter 3.41.9),这个版本引入了多项性能改进和新特性,包括增强的模式匹配和更完善的空安全支持。
2. 基础语法结构
2.1 变量与类型系统
Dart是强类型语言,但支持类型推断。变量声明主要有以下几种方式:
dart复制var name = 'Dart'; // 类型推断为String
final version = 3.4; // 运行时常量
const apiVersion = 1; // 编译时常量
String language = 'Dart'; // 显式类型声明
dynamic anyType = 100; // 动态类型
Dart内置的基本类型包括:
- 数值类型:
int、double - 字符串:
String - 布尔:
bool - 列表:
List - 集合:
Set - 映射:
Map - 符号:
Symbol - 空值:
Null
2.2 控制流程
Dart的控制语句与大多数C风格语言类似:
dart复制// if-else
if (year >= 2023) {
print('Current');
} else {
print('Outdated');
}
// for循环
for (var i = 0; i < 5; i++) {
print(i);
}
// while循环
while (!isDone) {
doSomething();
}
// switch-case (Dart 3.0+增强)
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}
2.3 函数与参数
Dart的函数支持多种参数传递方式:
dart复制// 必需参数
int add(int a, int b) {
return a + b;
}
// 可选位置参数
String say(String from, [String? msg]) {
return '$from says ${msg ?? 'nothing'}';
}
// 可选命名参数
void enableFlags({bool bold = false, bool hidden = false}) {
// ...
}
// 箭头函数
var list = [1, 2, 3];
var doubled = list.map((x) => x * 2);
3. 面向对象特性
3.1 类与对象
Dart是完全面向对象的语言,每个对象都是某个类的实例:
dart复制class Person {
// 实例变量
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.guest() {
name = 'Guest';
age = 18;
}
// 方法
void introduce() {
print('Hi, I\'m $name, $age years old.');
}
}
var p = Person('Alice', 25);
p.introduce();
3.2 继承与接口
Dart使用单继承模型,但通过mixin实现多重继承:
dart复制// 基类
abstract class Animal {
void eat();
}
// 接口
class Flyable {
void fly() => print('Flying');
}
// 继承与mixin
class Bird extends Animal with Flyable {
@override
void eat() => print('Eating seeds');
}
var bird = Bird();
bird.eat();
bird.fly();
3.3 空安全
Dart 2.12引入的空安全是类型系统的重大改进:
dart复制String? nullableString = null; // 可空类型
String nonNullableString = 'Dart'; // 非空类型
void printLength(String? str) {
if (str != null) {
print(str.length); // 空安全访问
}
print(str?.length); // 条件访问运算符
print(str!.length); // 断言非空(慎用)
}
4. 高级特性
4.1 异步编程
Dart通过Future和async/await简化异步操作:
dart复制Future<String> fetchUserData() async {
await Future.delayed(Duration(seconds: 1)); // 模拟网络请求
return '{"name": "John", "age": 30}';
}
void main() async {
print('Fetching data...');
var data = await fetchUserData();
print('Received: $data');
}
4.2 扩展方法
Dart 2.7引入的扩展方法允许向现有类添加功能:
dart复制extension NumberParsing on String {
int parseInt() {
return int.parse(this);
}
}
void main() {
print('42'.parseInt()); // 使用扩展方法
}
4.3 泛型
泛型帮助编写类型安全的可重用代码:
dart复制class Cache<T> {
final Map<String, T> _cache = {};
T? get(String key) => _cache[key];
void set(String key, T value) {
_cache[key] = value;
}
}
var stringCache = Cache<String>();
stringCache.set('name', 'Dart');
5. 开发实践与工具链
5.1 开发环境配置
安装Dart SDK的推荐方式:
bash复制# macOS
brew tap dart-lang/dart
brew install dart
# Windows
choco install dart-sdk
# 验证安装
dart --version
5.2 常用开发工具
-
IDE支持:
- Visual Studio Code + Dart/Flutter插件
- Android Studio/IntelliJ IDEA + Dart插件
- DartPad (在线编辑器)
-
包管理:
- 使用
pubspec.yaml管理依赖 - 运行
dart pub get获取依赖
- 使用
-
构建工具:
dart compile:将Dart代码编译为本地可执行文件dart run:直接运行Dart脚本
5.3 调试技巧
-
断点调试:
- 在VS Code中设置断点
- 使用
debugger()语句触发调试器
-
日志输出:
dart复制import 'dart:developer'; void main() { log('App started', name: 'my.app'); } -
性能分析:
bash复制
dart run --observe your_script.dart然后访问
http://localhost:8181查看性能分析器
6. 与Flutter的关系
Dart作为Flutter的官方语言,其语法特性与Flutter框架深度集成:
-
Widget树声明:
dart复制class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Dart in Flutter')), body: Center(child: Text('Hello World')), ), ); } } -
状态管理:
- 使用
setState的简单状态管理 - 通过
Provider、Riverpod等库的响应式编程
- 使用
-
平台交互:
dart复制// 调用原生平台代码 static const platform = MethodChannel('samples.flutter.dev/battery'); final int result = await platform.invokeMethod('getBatteryLevel');
Dart的热重载功能极大提升了Flutter开发效率,使开发者能在不重启应用的情况下立即看到代码更改的效果。
