Dart 基础教程

Dart 基础教程

一、环境搭建与第一个程序

  1. 安装Dart SDK

  2. 第一个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
}

十一、最佳实践

  1. 始终启用空安全
  2. 使用final声明不需要修改的变量
  3. 优先使用??运算符处理空值
  4. 对于简单构造函数使用语法糖形式
  5. 异步操作统一使用async/await
  6. 集合操作多使用高阶函数(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
相关推荐
程序员Ctrl喵15 小时前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter
前端不太难17 小时前
Flutter 如何设计可长期维护的模块边界?
flutter
小蜜蜂嗡嗡18 小时前
flutter列表中实现置顶动画
flutter
始持18 小时前
第十二讲 风格与主题统一
前端·flutter
始持18 小时前
第十一讲 界面导航与路由管理
flutter·vibecoding
始持18 小时前
第十三讲 异步操作与异步构建
前端·flutter
新镜19 小时前
【Flutter】 视频视频源横向、竖向问题
flutter
黄林晴19 小时前
Compose Multiplatform 1.10 发布:统一 Preview、Navigation 3、Hot Reload 三箭齐发
android·flutter
Swift社区20 小时前
Flutter 应该按功能拆,还是按技术层拆?
flutter
肠胃炎20 小时前
树形选择器组件封装
前端·flutter