1. 环境搭建
1.1 安装 Dart SDK
Windows: 从 Dart 官网 下载安装程序,或通过 Chocolatey 安装。
macOS: 使用 Homebrew 安装
brew install dart。Linux: 通过包管理器安装,如
sudo apt-get install dart。
验证安装:
dart --version1.2 编辑器/IDE
Visual Studio Code: 安装 Dart 和 Flutter 插件。
Android Studio / IntelliJ IDEA: 安装 Dart 插件。
也可以直接使用命令行和任何文本编辑器。
1.3 第一个程序
创建文件 hello.dart:
void main() {
print('Hello, Dart!');
}运行:
dart hello.dart2. 基础语法
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 内置数据类型
数字:
int、double字符串:
String,支持单引号、双引号,插值使用${expression}。布尔:
bool,只有true和false。列表:
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类型测试:
is、is!级联操作符:
..允许连续调用对象的方法或属性。
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:支持
break、continue,无穿透。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 捕获异常,所有异常都是 Exception 或 Error 的子类型。
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-catch 与 async/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:包管理命令。