Dart 基础教程
一、环境搭建与第一个程序
-
安装Dart SDK
- 官网下载:dart.dev/get-dart
- 验证安装:
dart --version
-
第一个Dart程序
dart
void main() {
print('Hello, Dart World!');
}
运行结果:
Hello, Dart World!
二、变量与数据类型
1. 变量声明
dart
var name = 'Alice'; // 类型推断
String city = 'London'; // 显式声明
dynamic anything = 5; // 动态类型
final PI = 3.14; // 运行时常量
const gravity = 9.8; // 编译时常量
2. 基本数据类型
dart
int age = 25; // 整数
double price = 9.99; // 浮点数
bool isStudent = true; // 布尔值
String greeting = 'Hello'; // 字符串
List<int> numbers = [1,2,3]; // 列表
Map<String, int> scores = { // Map集合
'Math': 90,
'English': 85
};
3. 类型检查与转换
dart
var value = '123';
print(value is String); // true
int numValue = int.parse(value);
String strValue = numValue.toString();
三、运算符
1. 基础运算符
dart
int a = 10, b = 3;
print(a + b); // 13
print(a ~/ b); // 3 (整除)
print(a++); // 10 (后置递增)
2. 空安全运算符
dart
String? nullableName;
print(nullableName ?? 'Default'); // 空合并
print(nullableName?.length); // 安全访问
四、控制流程
1. 条件语句
dart
int score = 85;
if (score >= 90) {
print('优秀');
} else if (score >= 60) {
print('及格');
} else {
print('不及格');
}
// 三元运算符
var result = score >= 60 ? '通过' : '补考';
2. 循环语句
dart
// for循环
for (var i = 0; i < 5; i++) {
print(i);
}
// for-in循环
var fruits = ['apple', 'banana', 'orange'];
for (var fruit in fruits) {
print(fruit);
}
// while循环
int count = 3;
while (count > 0) {
print(count--);
}
五、函数
1. 基本函数
dart
// 函数定义
double calculateBMI(double weight, double height) {
return weight / (height * height);
}
// 箭头函数
String greet(String name) => 'Hello, $name!';
void main() {
print(calculateBMI(70, 1.75)); // 22.857
print(greet('Bob')); // Hello, Bob!
}
2. 参数类型
dart
// 命名参数
void register({String name, int age}) {
print('$name ($age) registered');
}
// 可选参数
String say(String from, [String? to]) {
return to != null ? '$from to $to' : from;
}
void main() {
register(name: 'Alice', age: 25);
print(say('Hello')); // Hello
print(say('Hi', 'there')); // Hi to there
}
六、面向对象编程
1. 类与对象
dart
class Person {
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.newborn(String name) : this(name, 0);
// 方法
void introduce() {
print('我是$name,今年$age岁');
}
}
void main() {
var p1 = Person('Alice', 25);
var baby = Person.newborn('Charlie');
p1.introduce(); // 我是Alice,今年25岁
}
2. 继承与多态
dart
class Animal {
void makeSound() => print('---');
}
class Dog extends Animal {
@override
void makeSound() => print('汪汪!');
}
void main() {
Animal myPet = Dog();
myPet.makeSound(); // 汪汪!
}
3. Mixin
dart
mixin Flyable {
void fly() => print('飞行中...');
}
class Bird with Flyable {}
void main() {
var sparrow = Bird();
sparrow.fly(); // 飞行中...
}
七、异常处理
dart
void main() {
try {
var result = 100 ~/ 0;
} on IntegerDivisionByZeroException {
print('除数不能为零!');
} catch (e) {
print('未知错误: $e');
} finally {
print('处理完成');
}
}
八、集合与泛型
1. List操作
dart
var numbers = [1, 2, 3];
numbers.add(4);
numbers.removeAt(0);
print(numbers.where((n) => n > 2)); // (3,4)
2. Map操作
dart
var capitals = {
'China': 'Beijing',
'Japan': 'Tokyo'
};
capitals['USA'] = 'Washington';
print(capitals.containsKey('China')); // true
3. 泛型使用
dart
class Box<T> {
T content;
Box(this.content);
}
void main() {
var stringBox = Box<String>('Secret');
var intBox = Box<int>(42);
}
九、异步编程
1. Future基础
dart
Future<String> fetchUser() async {
await Future.delayed(Duration(seconds: 1));
return '用户数据';
}
void main() async {
print('开始获取...');
var user = await fetchUser();
print('获取到:$user');
}
2. Stream使用
dart
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
await Future.delayed(Duration(milliseconds: 500));
yield i;
}
}
void main() async {
await for (var num in countStream(3)) {
print(num); // 间隔0.5秒输出1,2,3
}
}
十、综合案例:温度转换器
dart
class Temperature {
double celsius;
Temperature(this.celsius);
double get fahrenheit => celsius * 9/5 + 32;
factory Temperature.fromFahrenheit(double f) {
return Temperature((f - 32) * 5/9);
}
}
void main() {
var t1 = Temperature(25);
print('25°C = ${t1.fahrenheit.toStringAsFixed(1)}°F'); // 77.0°F
var t2 = Temperature.fromFahrenheit(77);
print('77°F = ${t2.celsius}°C'); // 25°C
}
十一、最佳实践
- 始终启用空安全
- 使用final声明不需要修改的变量
- 优先使用??运算符处理空值
- 对于简单构造函数使用语法糖形式
- 异步操作统一使用async/await
- 集合操作多使用高阶函数(map, where, reduce等)
十二、扩展练习
实现一个简易待办事项应用:
- 使用类管理待办事项
- 支持添加/删除任务
- 可以标记任务完成状态
- 保存数据到本地文件
dart
class TodoItem {
String title;
bool isDone;
TodoItem(this.title, [this.isDone = false]);
}
class TodoList {
final List<TodoItem> _items = [];
void add(String title) => _items.add(TodoItem(title));
void remove(int index) => _items.removeAt(index);
void toggleDone(int index) {
_items[index].isDone = !_items[index].isDone;
}
void display() {
_items.asMap().forEach((i, item) {
print('${i+1}. [${item.isDone ? '✓' : ' '}] ${item.title}');
});
}
}
void main() {
var myList = TodoList();
myList.add('学习Dart');
myList.add('练习Flutter');
myList.toggleDone(0);
myList.display();
}
输出结果:
css
1. [✓] 学习Dart
2. [ ] 练习Flutter