Dart 笔记

Dart 笔记

_

1. 环境搭建

1.1 安装 Dart SDK

  • Windows: 从 Dart 官网 下载安装程序,或通过 Chocolatey 安装。

  • macOS: 使用 Homebrew 安装 brew install dart

  • Linux: 通过包管理器安装,如 sudo apt-get install dart

验证安装:

dart --version

1.2 编辑器/IDE

  • Visual Studio Code: 安装 Dart 和 Flutter 插件。

  • Android Studio / IntelliJ IDEA: 安装 Dart 插件。

  • 也可以直接使用命令行和任何文本编辑器。

1.3 第一个程序

创建文件 hello.dart

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

运行:

dart hello.dart

2. 基础语法

2.1 入口与注释

  • 每个 Dart 程序必须有一个 main() 函数作为入口。

注释支持:

// 单行注释
/* 多行注释 */
/// 文档注释(用于生成 API 文档)

2.2 变量与常量

  • 使用 var 声明可变变量,类型自动推导。

  • 显式类型声明:int age = 25;

常量:

  • final: 只能被赋值一次,在运行时确定。

  • const: 编译时常量,值在编译时确定。

var name = 'Alice';
int age = 30;
final String city = 'Beijing';
const double pi = 3.14159;

2.3 内置数据类型

  • 数字intdouble

  • 字符串String,支持单引号、双引号,插值使用 ${expression}

  • 布尔bool,只有 truefalse

  • 列表List,如 List<int> numbers = [1, 2, 3];

  • 集合Set,无序且唯一。

  • 映射Map,键值对。

  • 符号Symbol,通常用于反射。

  • Runes:用于表示 Unicode 字符。

示例:

int a = 10;
double b = 3.14;
String greeting = 'Hello';
bool isOpen = true;

List<String> fruits = ['apple', 'banana'];
Set<int> uniqueNumbers = {1, 2, 3};
Map<String, int> scores = {'Alice': 90, 'Bob': 85};

2.4 运算符

  • 算术+-*/~/(整除)、%

  • 关系==!=><>=<=

  • 逻辑&&||!

  • 赋值=+=-=??=(空值赋值)

  • 条件condition ? expr1 : expr2

  • 类型测试isis!

  • 级联操作符.. 允许连续调用对象的方法或属性。

var sb = StringBuffer()
  ..write('Hello')
  ..write(' ')
  ..write('World');

2.5 控制流

  • if-else

  • for 循环for (int i = 0; i < 5; i++)for (var item in list)

  • while / do-while

  • switch-case:支持 breakcontinue,无穿透。

  • assert:调试时断言条件为真。

示例:

if (age >= 18) {
  print('Adult');
} else {
  print('Minor');
}

for (var fruit in fruits) {
  print(fruit);
}

while (count < 10) {
  count++;
}

switch (grade) {
  case 'A':
    print('Excellent');
    break;
  default:
    print('Keep trying');
}

3. 函数

Dart 是真正的面向对象语言,函数也是对象,类型为 Function。函数可以赋值给变量,也可以作为参数传递。

3.1 基本定义

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

3.2 可选参数

  • 命名参数:用大括号 {} 包裹,调用时指定参数名。

void greet({String name = 'Guest', int age}) {
  print('Hello $name, age $age');
}
// 调用
greet(name: 'Alice', age: 25);
greet(); // 使用默认值
  • 位置可选参数:用方括号 [] 包裹。

void log(String message, [String prefix]) {
  print('$prefix: $message');
}
log('Error', 'FATAL'); // 可选参数

3.3 箭头函数

适用于单行表达式:

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

3.4 匿名函数(Lambda)

var list = [1, 2, 3];
list.forEach((item) {
  print(item);
});

3.5 函数作为参数

void execute(Function callback) {
  callback();
}

3.6 闭包

函数可以捕获其作用域内的变量。


4. 面向对象编程

Dart 中的所有对象都是类的实例,且所有类都继承自 Object

4.1 类与对象

class Person {
  String name;
  int age;

  // 构造方法(简写)
  Person(this.name, this.age);

  // 方法
  void sayHello() {
    print('Hello, I am $name');
  }
}

void main() {
  var p = Person('Alice', 30);
  p.sayHello();
}

4.2 构造方法

  • 默认构造:如果不定义,则有一个无参构造。

  • 命名构造Person.fromJson(Map<String, dynamic> json)

  • 重定向构造:调用其他构造方法。

  • 常量构造const 关键字,创建编译时常量。

  • 工厂构造factory,用于控制实例化过程(如单例、缓存)。

示例:

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

  // 命名构造
  Point.origin() : x = 0, y = 0;

  // 重定向构造
  Point.fromX(double x) : this(x, 0);
}

4.3 继承与多态

使用 extends 继承,@override 重写方法。

class Student extends Person {
  String school;

  Student(String name, int age, this.school) : super(name, age);

  @override
  void sayHello() {
    print('Hello, I am student $name from $school');
  }
}

4.4 抽象类与接口

  • 抽象类:使用 abstract 定义,不能实例化,可以包含抽象方法。

  • 接口:Dart 中没有 interface 关键字,每个类都隐式定义了一个接口,可以使用 implements 实现一个或多个接口。

abstract class Animal {
  void makeSound(); // 抽象方法
}

class Dog implements Animal {
  @override
  void makeSound() {
    print('Bark');
  }
}

4.5 混入(Mixin)

混入允许在多个类中复用代码,使用 mixin 定义,with 使用。

mixin Flyable {
  void fly() => print('Flying');
}

class Bird with Flyable {}

5. 异常处理

Dart 使用 try-catch-finally 捕获异常,所有异常都是 ExceptionError 的子类型。

try {
  throw FormatException('Invalid format');
} on FormatException catch (e) {
  print('Format error: $e');
} catch (e, s) {
  print('Unknown error: $e');
  print('Stack trace: $s');
} finally {
  print('Cleanup');
}

也可以使用 rethrow 重新抛出异常。


6. 泛型

Dart 支持泛型,提高代码复用性和类型安全。

class Box<T> {
  T value;
  Box(this.value);
}

void main() {
  var intBox = Box<int>(10);
  var strBox = Box<String>('Hello');
}

泛型方法:

T identity<T>(T value) => value;

7. 异步编程

Dart 是单线程语言,但通过事件循环和异步机制实现非阻塞操作。

7.1 Future 与 async/await

Future 表示一个可能尚未完成的操作。

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'Data loaded';
}

void main() async {
  print('Start');
  String data = await fetchData();
  print(data);
}

错误处理使用 try-catchasync/await

7.2 Stream 与异步循环

Stream 用于处理一系列异步事件。

Stream<int> 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 value in countStream(5)) {
    print(value);
  }
}

8. 库与包管理

8.1 导入库

使用 import 引入库:

import 'dart:math';      // 核心库
import 'package:http/http.dart' as http; // 第三方包
import 'my_library.dart'; // 本地文件

8.2 包管理

  • 使用 pub 工具管理依赖。

  • 创建 pubspec.yaml 文件描述依赖。

    name: my_app
    dependencies:
      http: ^0.13.0
    dev_dependencies:
      test: ^1.16.0
  • 运行 pub get 获取依赖。


9. 常用工具

  • dart format:格式化代码。

  • dart analyze:静态分析代码。

  • dart test:运行测试。

  • pub:包管理命令。

人生是旷野:再颠簸,也要闪亮地活 2026-03-19
Flutter笔记 2026-03-25

评论区