Dart 教程

Dart 教程

Dart 是 Google 开发的编程语言,用于构建高性能的移动端(Flutter)、Web 和桌面应用,以简洁语法与强类型著称。

本教程包含

  • 基础篇:简介、环境搭建、第一个程序、基础语法、变量与数据类型
  • 进阶篇:控制流、集合、函数、类与对象、泛型、异常、异步编程
  • 应用篇:库与导入、面向对象特性、Flutter 集成、工具链

为什么学习 Dart

  • Flutter 的唯一开发语言(跨平台 UI 框架)
  • JIT 热重载 + AOT 编译,开发快运行快
  • 同时支持移动/Web/桌面/服务端
  • 类型安全、语法现代

Dart 的特点

强类型(可推断)
一切皆对象
基于类的 OOP
异步: Future/Stream
空安全(null safety)
集合: List/Set/Map

Dart 简介

Dart 简介

Dart 于 2011 年由 Google 发布,2018 年随着 Flutter 发布而流行,2021 年起支持空安全。

核心特性

  • 类型安全:编译期发现类型错误
  • 空安全:变量默认非空,避免空指针
  • 多范式:面向对象 + 函数式特性
  • 双编译器:JIT(开发热重载)/ AOT(发布高性能)
  • 单线程 + 隔离:Isolate 并发模型

Hello World

void main() {
  print("Hello, Dart!");
}

运行方式

# 脚本运行
dart run hello.dart

# 或创建项目
dart create my_app
cd my_app
dart run

# 测试
dart test

应用领域

Flutter 移动/桌面/Web 应用
服务器端(Server-side, shelf/dart_frog)
命令行工具
Web 前端(编译为 JS)

DartPad(在线体验)

dartpad.dev  无需安装,浏览器即可编写运行

Dart 开发环境搭建

Dart 开发环境搭建

搭建 Dart 开发环境:SDK 安装 + IDE 配置。

1. 安装 Dart SDK

# 方式一: 独立安装
brew install dart          # macOS
sudo apt install dart      # Debian/Ubuntu(需官方源)

# 方式二: 随 Flutter 安装(推荐)
# 安装 Flutter SDK 后自带 Dart
flutter --version

2. 验证安装

dart --version
# Dart SDK version: 3.x.x

3. IDE 配置

VS Code:
  安装 "Dart" 和 "Flutter" 扩展
  支持语法高亮、自动补全、调试、热重载

Android Studio / IntelliJ:
  安装 Dart 与 Flutter 插件

4. 创建项目

# 控制台项目
dart create console_app
dart create -t console my_console

# Flutter 项目
flutter create my_flutter_app

# 模板类型
console   控制台
web       Web 应用
package   Dart 包/库

5. 常用命令

dart run           运行
dart test          运行测试
dart analyze       静态分析
dart format .      代码格式化
dart pub get       安装依赖

第一个 Dart 程序

第一个 Dart 程序

编写并运行第一个 Dart 程序,熟悉基本结构。

Hello World

// main.dart
void main() {
  print("Hello, Dart!");
  print(1 + 2);
  print("计算: ${3 * 4}");
}

// 输出:
// Hello, Dart!
// 3
// 计算: 12

运行

dart run main.dart

程序结构解析

void main() {
  // 程序入口,必须有 main
}

// void: 无返回值
// 花括号: 代码块
// print(): 输出到控制台
// // 单行注释  /* */ 多行注释  /// 文档注释

变量与输出

void main() {
  var name = "老王";
  int age = 30;
  double height = 1.75;
  bool isStudent = false;

  print("$name $age 岁");
  print("身高: ${height}m");
}

字符串插值

var city = "北京";
print("我在 $city");        // 简单变量
print("总价: ${2 + 3} 元");  // 表达式用 ${}

运行方式

dart run <文件名>.dart
或进入交互模式: dart 后直接输入表达式(旧版 dart repl)

Dart 基础语法

Dart 基础语法

Dart 语法接近 C/Java/JavaScript,同时融合了现代语言特性。

语句与分号

每条语句以分号 ; 结束
var x = 10;
print(x);

注释

// 单行注释
/* 多行
   注释 */
/// 文档注释(用于生成文档)
/// 对函数/类写文档注释是良好习惯

变量声明

var name = "Dart";       // 类型推断
final city = "北京";      // 常量(运行期确定)
const pi = 3.14159;      // 编译期常量

String lang = "Dart";    // 显式类型
int count = 10;
double price = 9.9;
bool ok = true;

// final vs const
final t = DateTime.now();   // OK: 运行期赋值
// const t2 = DateTime.now(); // 错误: 必须编译期常量

动态类型(dynamic)

dynamic x = 10;
x = "hello";    // 可改类型(慎用,失去类型检查)
var y = 10;     // var 推断后类型固定
// y = "hello"; // 错误: y 是 int

标识符规则

字母/数字/下划线/$,不能数字开头
变量驼峰: myVariable
类名大写: MyClass
常量: 小驼峰或 SCREAMING_CASE

关键字

class/extends/implements/void/main
var/final/const/if/else/for/while/return
(与多数语言相似)

Dart 变量与数据类型

Dart 变量与数据类型

深入 Dart 的核心类型:数字、字符串、布尔与集合。

数字类型

int a = 10;         // 整数
double b = 3.14;    // 浮点
num c = 42;         // 数字父类型(可存 int 或 double)
num d = 3.5;

print(a.isEven);    // true 偶数判断
print(b.round());   // 3 四舍五入
print(a.abs());     // 绝对值

// 转换
int x = int.parse("42");
double y = double.parse("3.14");
String s = 42.toString();

字符串

String s1 = "双引号";
String s2 = '单引号';
String s3 = """多行
字符串""";          // 三双引号
String s4 = '''也可以''';  // 三单引号

var name = "Dart";
print("Hello $name");            // 插值
print(r"原始字符串 
");          // raw 字符串(不转义)

布尔

bool isDone = true;
bool isOk = false;

// 条件必须为布尔(与 JS 不同,无真值转换)
if (isDone) { print("完成"); }
// if (1) {...}  错误: 1 不是布尔

集合

List nums = [1, 2, 3];
Set tags = {"a", "b"};
Map scores = {"math": 90};

// 推断写法
var list = [1, 2, 3];
var map = {"name": "老王", "age": 30};

空安全

String name = "ok";       // 非空类型
String? nullable = null;  // 可空类型(带?)

// 访问可空变量
print(nullable?.length);       // null(安全访问)
print(nullable!.length);       // 强制非空(危险,慎用)
if (nullable != null) { ... }  // 判空后安全使用

Dart 控制流

Dart 控制流

条件判断与循环控制,和主流语言类似。

if-else

int score = 85;

if (score >= 90) {
  print("优秀");
} else if (score >= 60) {
  print("及格");
} else {
  print("不及格");
}

switch-case

String grade = "B";

switch (grade) {
  case "A":
    print("优秀");
    break;
  case "B":
  case "C":
    print("良好");
    break;
  default:
    print("其他");
}

// Dart 3 支持 switch 表达式
var result = switch (grade) {
  "A" => "优秀",
  "B" || "C" => "良好",
  _ => "其他",
};

for 循环

for (int i = 0; i < 5; i++) {
  print(i);
}

// 遍历集合
var list = [1, 2, 3];
for (var item in list) {
  print(item);
}

// 带索引
for (var i = 0; i < list.length; i++) {
  print("$i: ${list[i]}");
}

while / do-while

int n = 0;
while (n < 3) {
  print(n);
  n++;
}

int m = 0;
do {
  print(m);      // 至少执行一次
  m++;
} while (m < 3);

break / continue

for (var i = 0; i < 10; i++) {
  if (i == 3) continue;   // 跳过
  if (i == 7) break;      // 终止
  print(i);
}

集合的 forEach / map

list.forEach((item) => print(item));

var doubled = list.map((x) => x * 2).toList();
var evens = list.where((x) => x.isEven).toList();

Dart 集合类型

Dart 集合类型

List、Set、Map 三大集合的完整使用。

List(列表,有序)

var list = [1, 2, 3];

list.add(4);            // 追加
list.addAll([5, 6]);    // 批量
list.remove(3);         // 删值
list.removeAt(0);       // 删索引
list[0] = 10;           // 修改
print(list.length);     // 长度
print(list.contains(2));// 包含

// 遍历
list.forEach(print);
for (var x in list) { print(x); }

// 操作
list.reversed            // 反转(迭代器)
list.sublist(1, 3)       // 子列表
list.sort()              // 排序

Set(集合,去重无序)

var tags = {"dart", "flutter"};

tags.add("ai");
tags.remove("dart");
print(tags.contains("flutter"));   // true
print(tags.length);

// 集合运算
var a = {1, 2, 3};
var b = {2, 3, 4};
print(a.union(b));      // {1,2,3,4}
print(a.intersection(b)); // {2,3}
print(a.difference(b)); // {1}

Map(键值对)

var scores = {"math": 90, "english": 85};

scores["chinese"] = 95;      // 新增/修改
scores.remove("math");       // 删除
print(scores["english"]);    // 85
print(scores.containsKey("math"));  // false

// 遍历
scores.forEach((k, v) => print("$k: $v"));
for (var key in scores.keys) { print(key); }
for (var value in scores.values) { print(value); }

常用构造

var filled = List.filled(5, 0);        // [0,0,0,0,0]
var generated = List.generate(5, (i) => i * i);  // [0,1,4,9,16]
var spread = [...list1, ...list2];     // 展开合并
var growable = [];                // 空列表

Dart 函数

Dart 函数

Dart 函数是对象,支持箭头语法、可选参数、闭包等高阶特性。

基本函数

int add(int a, int b) {
  return a + b;
}

// 箭头语法(单表达式)
int multiply(int a, int b) => a * b;

// 调用
print(add(1, 2));        // 3

可选参数

// 命名参数(推荐,可读性好)
void greet({required String name, int age = 18, String? city}) {
  print("你好 $name, $age 岁");
  if (city != null) print("来自 $city");
}

greet(name: "老王");
greet(name: "小李", age: 25, city: "北京");

// 位置可选参数
void info(String name, [int age = 0, String? email]) { ... }
info("老王");
info("老王", 30);

匿名函数与箭头

var list = [1, 2, 3];

// 匿名函数
list.forEach((item) {
  print(item * 2);
});

// 箭头
list.forEach((item) => print(item));

// 赋值给变量
var square = (int x) => x * x;
print(square(5));   // 25

闭包

Function makeCounter() {
  int count = 0;
  return () => ++count;   // 捕获 count
}

var counter = makeCounter();
print(counter());   // 1
print(counter());   // 2
print(counter());   // 3

高阶函数

int apply(int x, int Function(int) f) => f(x);

print(apply(5, (x) => x * 2));   // 10

// 返回函数
Function addN(int n) => (int x) => x + n;
var add5 = addN(5);
print(add5(10));   // 15

可选返回值与命名函数

String? findName(List names, String target) {
  for (var n in names) {
    if (n == target) return n;
  }
  return null;    // 可空返回
}

Dart 类与对象

Dart 类与对象

Dart 是纯面向对象语言,一切皆对象,类为基础单元。

定义类

class Person {
  String name;          // 属性
  int age;

  // 构造函数(简写语法)
  Person(this.name, this.age);

  // 方法
  void greet() {
    print("你好,我是 $name, $age 岁");
  }
}

void main() {
  var p = Person("老王", 30);
  p.greet();
  print(p.name);   // 老王
}

命名构造函数

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  // 命名构造函数
  Person.baby(this.name) : age = 0;

  // 重定向构造函数
  Person.anonymous() : this("匿名", 0);
}

var baby = Person.baby("小宝宝");
print(baby.age);   // 0

初始化列表

class Point {
  final double x, y;
  double distance;

  Point(this.x, this.y) : distance = (x * x + y * y).sqrt() {
    // 构造体(初始化列表之后执行)
  }
}

Getter / Setter

class Circle {
  double radius;
  Circle(this.radius);

  // getter
  double get area => 3.14159 * radius * radius;

  // setter
  set diameter(double d) => radius = d / 2;
}

var c = Circle(2);
print(c.area);       // 12.57...
c.diameter = 10;     // 设置直径
print(c.radius);     // 5

静态成员

class MathUtil {
  static const pi = 3.14159;

  static int square(int x) => x * x;
}

print(MathUtil.pi);          // 3.14159
print(MathUtil.square(4));   // 16

级联操作(..)

var p = Person("老王", 30)
  ..age = 31
  ..greet();
// 连续调用同一对象的方法/属性

Dart 泛型

Dart 泛型

泛型让代码适用于多种类型,同时保持类型安全。

泛型集合

List nums = [1, 2, 3];
List names = ["a", "b"];
Map scores = {"math": 90};
Set doubles = {1.5, 2.5};

// 不写泛型则默认 dynamic
var anything = [1, "a", true];   // List

泛型函数

T first(List items) {
  return items[0];
}

print(first([1, 2, 3]));       // 1
print(first(["a", "b"]));      // a
print(first([1, 2]));     // 显式指定

泛型类

class Box {
  T value;
  Box(this.value);

  T getValue() => value;
}

var intBox = Box(42);
var stringBox = Box("hello");

print(intBox.getValue());      // 42
print(stringBox.getValue());   // hello

泛型约束

// T 必须是 num 的子类
T maxOf(T a, T b) {
  return a > b ? a : b;
}

print(maxOf(3, 5));        // 5
print(maxOf(3.5, 2.1));    // 3.5
// maxOf("a", "b");        // 错误: String 不是 num

泛型与类型检查

var box = Box(10);
print(box is Box);    // true

// 泛型类型在运行时保留(与 Java 不同)
var b1 = Box(1);
var b2 = Box("x");
print(b1 is Box);     // true
print(b2 is Box);     // false

Dart 面向对象特性

Dart 面向对象特性

继承、抽象类、接口、混入等面向对象高级特性。

继承

class Animal {
  String name;
  Animal(this.name);

  void speak() => print("$name 发出声音");
}

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void speak() => print("$name 汪汪叫");
}

var dog = Dog("旺财");
dog.speak();   // 旺财 汪汪叫

抽象类

abstract class Shape {
  double area();   // 抽象方法(无实现)

  String describe() => "面积: ${area()}";  // 普通方法
}

class Circle extends Shape {
  final double radius;
  Circle(this.radius);

  @override
  double area() => 3.14159 * radius * radius;
}

// Shape s = Shape();  // 错误: 抽象类不能实例化
var c = Circle(2);
print(c.describe());

implements(实现接口)

class Printable {
  void printInfo() {}
}

class User implements Printable {
  String name;
  User(this.name);

  @override
  void printInfo() => print("用户: $name");
}

// Dart 类可隐式作为接口
var u = User("老王");
u.printInfo();

混入(mixin, with)

mixin Flyable {
  void fly() => print("飞行中...");
}

mixin Swimmable {
  void swim() => print("游泳中...");
}

class Bird with Flyable {}
class Duck with Flyable, Swimmable {}   // 多混入

var duck = Duck();
duck.fly();
duck.swim();

运算符重载

class Vector {
  final double x, y;
  Vector(this.x, this.y);

  Vector operator +(Vector other) =>
      Vector(x + other.x, y + other.y);

  @override
  String toString() => "($x, $y)";
}

var v1 = Vector(1, 2);
var v2 = Vector(3, 4);
print(v1 + v2);   // (4.0, 6.0)

Dart 异常处理

Dart 异常处理

异常处理保证程序健壮性,优雅处理错误。

抛出异常

void checkAge(int age) {
  if (age < 0) {
    throw ArgumentError("年龄不能为负");
  }
  if (age > 150) {
    throw StateError("年龄不合法");
  }
}

// 自定义异常
class BusinessException implements Exception {
  final String message;
  BusinessException(this.message);

  @override
  String toString() => "业务异常: $message";
}

捕获异常

try {
  int.parse("abc");
} on FormatException catch (e) {
  print("格式错误: $e");
} on Exception catch (e) {
  print("其他异常: $e");
} catch (e, stackTrace) {
  print("未知错误: $e");
  print(stackTrace);
} finally {
  print("无论是否异常都会执行");
}

安全转换与断言

// 转换失败返回 null
int? parsed = int.tryParse("abc");
print(parsed);   // null

// assert(仅调试模式生效)
void setScore(int s) {
  assert(s >= 0 && s <= 100, "分数范围 0-100");
  // ...
}

测试异常

// 测试中验证抛异常
// expect(() => checkAge(-1), throwsArgumentError);

最佳实践

1. 用户输入错误: 返回值或 Option 风格
2. 系统错误: 抛异常
3. 捕获后必须处理(至少记录日志)
4. 不要捕获所有异常而不处理

Dart 异步编程

Dart 异步编程

Future 和 Stream 是 Dart 异步编程的核心,支撑 Flutter 的非阻塞 UI。

Future(一次性异步结果)

// 模拟异步任务
Future fetchData() async {
  await Future.delayed(Duration(seconds: 1));
  return "数据加载完成";
}

void main() async {
  // await 等待结果
  String data = await fetchData();
  print(data);

  // then 链式
  fetchData().then((d) => print(d)).catchError((e) => print(e));
}

async / await

Future addAsync(int a, int b) async {
  await Future.delayed(Duration(milliseconds: 100));
  return a + b;
}

void main() async {
  var result = await addAsync(3, 4);
  print(result);   // 7

  // 并行执行(Future.wait)
  var results = await Future.wait([
    addAsync(1, 2),
    addAsync(3, 4),
  ]);
  print(results);   // [3, 7]
}

Stream(多次异步结果)

// 生成数据流
Stream countStream(int max) async* {
  for (int i = 1; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;    // 逐个产出
  }
}

void main() async {
  // 监听流
  await for (var n in countStream(3)) {
    print(n);   // 每秒输出 1 2 3
  }

  // 或 listen
  countStream(2).listen((n) => print("收到: $n"));
}

错误处理

Future risky() async {
  try {
    await Future.error("出错了");
  } catch (e) {
    print("捕获: $e");
  }
}

// Stream 错误
stream.listen(
  (data) => print(data),
  onError: (e) => print("流错误: $e"),
  onDone: () => print("流结束"),
);

在 Flutter 中使用

// FutureBuilder 异步构建 UI
FutureBuilder(
  future: fetchData(),
  builder: (context, snapshot) {
    if (snapshot.hasData) return Text(snapshot.data!);
    return CircularProgressIndicator();   // 加载中
  },
);

Dart 库与导入

Dart 库与导入

使用内置库、第三方包与自定义库组织代码。

导入库

// 核心库
import "dart:math";
import "dart:convert";
import "dart:io";

// 自定义库
import "utils/math_utils.dart";

// 包库(第三方)
import "package:http/http.dart";

// 前缀与部分导入
import "dart:math" as math;
import "package:foo/bar.dart" show Bar, baz;
import "package:foo/baz.dart" hide Baz;

常用内置库

import "dart:math";

print(pow(2, 10));         // 1024
print(sqrt(16));           // 4.0
print(max(3, 7));          // 7
print(Random().nextInt(100));  // 随机数

import "dart:convert";

var json = jsonEncode({"name": "老王"});
var map = jsonDecode(json);

创建自定义库

// utils/calculator.dart
library calculator;

int add(int a, int b) => a + b;
int sub(int a, int b) => a - b;

// 使用
import "utils/calculator.dart";
print(add(1, 2));   // 3

pub 包管理

# pubspec.yaml 声明依赖
dependencies:
  http: ^1.1.0

# 安装
dart pub get

# 添加
dart pub add http

# 使用
import "package:http/http.dart" as http;

Future main() async {
  var resp = await http.get(Uri.parse("https://example.com"));
  print(resp.statusCode);
}

常用第三方包

http           HTTP 请求
dio            HTTP 高级封装
path           路径处理
uuid           UUID 生成
intl           国际化/格式化
equatable      对象相等性
provider       Flutter 状态管理

Dart 常用内置库

Dart 常用内置库

深入最常用的几个内置库:math、convert、io、collection。

dart:math

import "dart:math";

pow(2, 8)             // 256
sqrt(81)              // 9.0
sin(pi / 2)           // 1.0
max(1, 9)             // 9
min(1, 9)             // 1
Random().nextInt(100) // 0-99
Random().nextDouble() // 0.0-1.0
Random().nextBool()   // true/false

dart:convert

import "dart:convert";

// JSON
var jsonStr = jsonEncode({"name": "老王", "age": 30});
var obj = jsonDecode(jsonStr) as Map;

// Base64
var encoded = base64Encode(utf8.encode("hello"));
var decoded = utf8.decode(base64Decode(encoded));

// UTF-8
var bytes = utf8.encode("中文");
print(utf8.decode(bytes));   // 中文

dart:io(文件系统)

import "dart:io";

// 读文件
final file = File("data.txt");
if (await file.exists()) {
  String content = await file.readAsString();
  print(content);
}

// 写文件
await File("out.txt").writeAsString("内容");

// 目录
var dir = Directory("mydir");
if (!await dir.exists()) await dir.create();
final entries = await dir.list().toList();

// 环境变量与命令行参数
print(Platform.environment["PATH"]);
print(Platform.operatingSystem);   // macos/windows/linux

dart:collection

import "dart:collection";

// 队列
final queue = Queue();
queue.add(1);
queue.removeFirst();

// 链表/哈希映射等
final map = HashMap();

dart:async(定时器)

import "dart:async";

// 延迟执行
Timer(Duration(seconds: 2), () => print("2秒后"));

// 周期执行
Timer.periodic(Duration(seconds: 1), (t) {
  print("每秒执行");
  if (条件) t.cancel();
});

Dart Isolate 并发

Dart Isolate 并发

Dart 用 Isolate(隔离区)实现并发:每个 Isolate 有独立内存,通过消息通信。

什么是 Isolate

单线程模型: 主 Isolate 处理事件循环
并发: 创建多个 Isolate 并行执行
隔离: 各 Isolate 独立内存,不共享变量
通信: 通过消息(SendPort/ReceivePort)

类似: 进程(而非线程)模型

创建 Isolate

import "dart:isolate";

void worker(SendPort sendPort) {
  // 在隔离区中执行(独立内存)
  sendPort.send("来自 worker 的消息");
}

void main() async {
  final receivePort = ReceivePort();

  // 启动 Isolate
  await Isolate.spawn(worker, receivePort.sendPort);

  // 接收消息
  final msg = await receivePort.first;
  print(msg);   // 来自 worker 的消息
}

compute(Flutter 常用)

// Flutter 中用 compute 简化(在 Flutter 中 import)
import "package:flutter/foundation.dart";

int heavyWork(int n) {
  var sum = 0;
  for (var i = 0; i < n; i++) sum += i;
  return sum;
}

// 在后台 Isolate 执行,不阻塞 UI
Future result = compute(heavyWork, 1000000);

Isolate 之间传数据

// 双向通信: 两个端口
void worker(SendPort mainPort) {
  final workerPort = ReceivePort();
  mainPort.send(workerPort.sendPort);   // 回传自己的端口

  workerPort.listen((msg) {
    print("worker 收到: $msg");
    mainPort.send("收到确认");
  });
}

何时使用

CPU 密集计算(JSON 解析、图像处理)
复杂加密/压缩
大数据处理
(避免阻塞 UI 线程)

I/O 操作(文件/网络)本身异步,无需 Isolate

限制

无法共享内存(需消息复制)
大数据传递开销大
Isolate 创建有成本(复用池)
UI 只能主 Isolate 操作

Dart 与 Flutter

Dart 与 Flutter

Dart 是 Flutter 的开发语言,理解两者关系是学习 Flutter 的前提。

Flutter 是什么

Flutter = Google 跨平台 UI 框架
用 Dart 编写
一套代码 → iOS/Android/Web/桌面

Dart 是 Flutter 的唯一语言
(Dart 语言特性支撑 Flutter 的响应式 UI)

Flutter 中 Dart 的应用

// Widget(组件)就是 Dart 类
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("标题")),
        body: Center(child: Text("内容")),
      ),
    );
  }
}

热重载(开发体验)

JIT 编译支持热重载:
  修改代码 → 保存 → 界面秒级更新(保留状态)

发布时 AOT 编译:
  高性能、启动快、包体小

状态管理与异步

// setState 更新界面
class Counter extends StatefulWidget {
  @override
  State createState() => _CounterState();
}

class _CounterState extends State {
  int count = 0;

  void _increment() {
    setState(() => count++);
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _increment,
      child: Text("点击: $count"),
    );
  }
}

学习路径

1. Dart 语法(本教程)
2. Flutter Widget 体系
3. 布局与组件
4. 状态管理(Provider/Riverpod/Bloc)
5. 网络与数据持久化
6. 打包发布

工具

flutter doctor     环境检查
flutter create     创建项目
flutter run        运行
flutter build      构建发布
flutter analyze    静态分析

Dart 工具链

Dart 工具链

掌握 Dart 开发工具链:格式化、分析、测试、调试。

dart format(格式化)

dart format lib/          # 格式化目录
dart format main.dart     # 格式化文件
dart format --output=none --set-exit-if-changed .  # CI 检查

dart analyze(静态分析)

dart analyze
# 检查代码问题: 类型错误、未使用变量、lint 警告

# analysis_options.yaml 配置规则
linter:
  rules:
    - prefer_const_constructors
    - avoid_print

dart test(测试)

// test/calculator_test.dart
import "package:test/test.dart";

int add(int a, int b) => a + b;

void main() {
  group("加法", () {
    test("正整数", () {
      expect(add(1, 2), 3);
    });

    test("负数", () {
      expect(add(-1, 1), 0);
    });
  });
}

// 运行
dart test

调试

VS Code:
  设置断点 → F5 调试
  Debug Console 查看变量

命令行:
  dart run --enable-vm-service main.dart
  打开 devtools 调试 UI

dart pub(包管理)

dart pub get        安装依赖
dart pub add x      添加依赖
dart pub upgrade    升级依赖
dart pub outdated   查看过期依赖
dart pub publish    发布包(pub.dev)

项目管理工具

melos      多包仓库管理
very_good_cli  项目脚手架
Dart Code Metrics  代码质量指标

Dart 最佳实践

Dart 最佳实践

编写高质量 Dart 代码的推荐实践。

命名规范

类/类型: UpperCamelCase(MyClass)
变量/函数: lowerCamelCase(myVariable)
常量: lowerCamelCase 或 SCREAMING_CASE
私有: 前缀下划线(_privateVar)
文件: snake_case(my_file.dart)
导入别名: 小写(library as lib)

空安全实践

// 使用可空类型表达可能为空
String? findName() => null;

// 安全访问
var name = findName();
print(name?.length);       // null
print(name ?? "默认值");   // 默认值

// late 延迟初始化
late String config;
config = loadConfig();

类型优先

// 避免 dynamic
dynamic x = "str";      // 不推荐
String x = "str";       // 推荐: 类型明确

// 使用泛型集合
List names = [];   // 而非 List names = []

不可变优先

class Config {
  final String host;     // final 不可变
  final int port;
  const Config(this.host, this.port);   // const 构造
}

// 数据类
class User {
  final String name;
  const User(this.name);

  @override
  bool operator ==(Object other) =>
      other is User && other.name == name;

  @override
  int get hashCode => name.hashCode;
}

其他实践

1. 集合操作优先函数式(map/filter)
2. 异常: 不要吞掉错误
3. 异步: 用 await 而非大量 then
4. 性能: 复用对象、避免不必要重建
5. 依赖注入替代全局状态
6. 注释: 解释为什么,而非是什么

Dart 总结与资源

Dart 总结与资源

恭喜完成 Dart 教程!回顾知识体系并给出后续资源。

知识体系回顾

  • 基础:环境搭建、第一个程序、变量与数据类型、控制流
  • 数据:List/Set/Map 集合、泛型
  • 函数:参数、匿名函数、闭包、高阶函数
  • OOP:类、继承、抽象、接口、mixin、运算符重载
  • 健壮性:异常处理、空安全、断言
  • 异步:Future、Stream、async/await、Isolate
  • 工程:库、pub 包、工具链、测试、最佳实践

下一步学习路线

  1. Flutter 入门:Widget、布局、状态管理
  2. Dart 服务端:shelf / dart_frog 构建 API
  3. Dart Web:编译为 JavaScript 的 Web 开发
  4. 深入语言:扩展、宏(Dart 3)、模式匹配

学习资源

官方文档: dart.dev
语言之旅: dart.dev/language
DartPad:  dartpad.dev(在线练习)
中文社区: Dart 中文文档 / Flutter 中文社区
示例: github.com/dart-lang/samples

实践建议

1. 用 DartPad 每天练 30 分钟语法
2. 做一个命令行小工具(文件整理/爬虫)
3. 用 Flutter 复刻一个常用 App 界面
4. 阅读优秀开源 Flutter 项目源码
5. 坚持 dart analyze 零警告

Dart 语法简洁现代,配合 Flutter 生态,是当前跨平台开发的优选语言。掌握本教程,你已具备继续深入 Flutter 开发的坚实基础。

第 1 / 21 节