软件研发 --- hello world 项目 之 跨平台原生 Dart
Dart 安装运行完整指南
目录
Dart 简介
Dart 是由 Google 开发的现代编程语言,专为构建快速、可扩展的应用程序而设计。Dart 是 Flutter 框架的核心语言,同时也可用于 Web、服务器端和命令行应用开发。
Dart 的特点
- 现代语言设计:简洁、表达力强的语法
- 强类型系统:静态类型检查,支持类型推断
- 空安全:编译时防止空指针异常
- 面向对象:支持类、继承、接口、混入(Mixin)
- 异步编程:内置 Future 和 async/await 支持
- 跨平台:一套代码,多平台运行
- 高性能:AOT 和 JIT 编译,优化的垃圾回收
- 热重载:快速开发迭代体验
- 丰富生态:pub.dev 包管理平台
Dart 的应用领域
- 移动应用开发:Flutter 跨平台移动应用
- Web 开发:前端 Web 应用和 PWA
- 桌面应用:Windows、macOS、Linux 桌面应用
- 服务器端开发:后端 API 和微服务
- 命令行工具:CLI 工具和脚本
- 嵌入式开发:IoT 设备和嵌入式系统
Dart 版本历史
- Dart 1.0(2013):首个稳定版本
- Dart 2.0(2018):强类型系统重构
- Dart 2.12(2021):空安全稳定版
- Dart 3.0(2023):100% 空安全,移除遗留特性
安装 Dart SDK
方法一:官方安装器(推荐)
Windows
使用 Chocolatey(推荐):
# 安装 Chocolatey(如果未安装)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 安装 Dart SDK
choco install dart-sdk
# 更新 Dart SDK
choco upgrade dart-sdk
手动安装:
- 访问 https://dart.dev/get-dart
- 下载 Windows 版本的 Dart SDK
- 解压到目录(如
C:\dart-sdk) - 添加
C:\dart-sdk\bin到系统 PATH 环境变量
添加环境变量步骤:
1. 右键 "此电脑" -> "属性"
2. 点击 "高级系统设置"
3. 点击 "环境变量"
4. 在 "系统变量" 中找到 "Path"
5. 点击 "编辑" -> "新建"
6. 添加 "C:\dart-sdk\bin"
7. 点击 "确定" 保存
macOS
使用 Homebrew(推荐):
# 安装 Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装 Dart SDK
brew tap dart-lang/dart
brew install dart
# 更新 Dart SDK
brew upgrade dart
手动安装:
# 下载并解压 Dart SDK
cd ~/Downloads
wget https://storage.googleapis.com/dart-archive/channels/stable/release/latest/sdk/dartsdk-macos-x64-release.zip
unzip dartsdk-macos-x64-release.zip
# 移动到合适位置
sudo mv dart-sdk /usr/local/
# 添加到 PATH
echo 'export PATH="/usr/local/dart-sdk/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
Linux
Ubuntu/Debian:
# 添加 Dart 官方仓库
sudo apt-get update
sudo apt-get install apt-transport-https
wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/dart.gpg
echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list
# 安装 Dart SDK
sudo apt-get update
sudo apt-get install dart
# 添加到 PATH
echo 'export PATH="/usr/lib/dart/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
CentOS/RHEL/Fedora:
# 添加 Dart 仓库
sudo tee /etc/yum.repos.d/dart_stable.repo << EOM
[dart_stable]
name=Dart Stable
baseurl=https://storage.googleapis.com/download.dartlang.org/linux/centos/stable/
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
EOM
# 安装 Dart SDK
sudo yum install dart
# 或者在较新版本中使用
sudo dnf install dart
Arch Linux:
# 使用 AUR
yay -S dart
# 或者
pacman -S dart
手动安装(通用):
# 下载 Dart SDK
wget https://storage.googleapis.com/dart-archive/channels/stable/release/latest/sdk/dartsdk-linux-x64-release.zip
# 解压
unzip dartsdk-linux-x64-release.zip
# 移动到系统目录
sudo mv dart-sdk /opt/
# 创建符号链接
sudo ln -s /opt/dart-sdk/bin/dart /usr/local/bin/dart
sudo ln -s /opt/dart-sdk/bin/dartaotruntime /usr/local/bin/dartaotruntime
方法二:使用 Flutter SDK(包含 Dart)
如果你计划开发 Flutter 应用,可以直接安装 Flutter SDK,它包含了 Dart SDK:
# 下载 Flutter SDK
git clone https://github.com/flutter/flutter.git -b stable
# 添加到 PATH
export PATH="$PATH:`pwd`/flutter/bin"
# 运行 Flutter doctor 检查环境
flutter doctor
方法三:使用 Docker
# 拉取 Dart 官方镜像
docker pull dart:stable
# 运行 Dart 容器
docker run -it --rm -v $(pwd):/app -w /app dart:stable dart hello.dart
# 或者创建 Dockerfile
FROM dart:stable
WORKDIR /app
COPY . .
RUN dart pub get
CMD ["dart", "run"]
方法四:在线开发环境
DartPad(官方在线编辑器):
- 访问:https://dartpad.dev/
- 无需安装,直接在浏览器中编写和运行 Dart 代码
- 支持 Flutter 代码预览
- 适合学习和快速原型开发
验证安装
检查 Dart 版本
# 检查 Dart 版本
dart --version
# 查看详细信息
dart --help
# 检查 Dart 分析器
dart analyze --help
# 检查 Dart 格式化工具
dart format --help
预期输出示例:
C:\> dart --version
Dart SDK version: 3.2.0 (stable) (Tue Nov 14 09:35:58 2023 +0000) on "windows_x64"
验证环境配置
# 检查 PATH 配置
echo $PATH # Linux/macOS
echo %PATH% # Windows
# 查找 Dart 可执行文件位置
which dart # Linux/macOS
where dart # Windows
# 检查 Dart SDK 路径
dart --version --verbose
创建测试项目
# 创建新的 Dart 项目
dart create hello_world
cd hello_world
# 查看项目结构
ls -la # Linux/macOS
dir # Windows
# 运行默认程序
dart run
运行 Hello World 程序
// Dart Hello World 程序 // Dart 是 Google 开发的现代编程语言,主要用于构建移动、Web 和桌面应用 // 导入 Dart 核心库,提供基本的输入输出功能 import 'dart:io'; import 'dart:math'; import 'dart:convert'; // 主函数 - Dart 程序的入口点 // void 表示函数不返回值 // main 是程序执行的起始点 void main() { // 1. 基本输出 print('Hello, World!'); print('欢迎来到 Dart 编程世界!'); // 2. 变量声明和类型推断 // var 关键字让 Dart 自动推断类型 var name = 'Dart'; var version = 3.2; var isAwesome = true; // 显式类型声明 String language = 'Dart'; int year = 2023; double pi = 3.14159; bool isOpenSource = true; // 3. 字符串插值 - 使用 $ 符号在字符串中嵌入变量 print('编程语言: $name'); print('版本: $version'); print('发布年份: $year'); print('是否开源: $isOpenSource'); // 复杂表达式需要使用 ${} 语法 print('圆周率保留两位小数: ${pi.toStringAsFixed(2)}'); // 4. 列表(List)操作 // Dart 中的数组称为 List List<String> fruits = ['苹果', '香蕉', '橙子']; List<int> numbers = [1, 2, 3, 4, 5]; print('\n=== 列表操作 ==='); print('水果列表: $fruits'); print('数字列表: $numbers'); print('第一个水果: ${fruits[0]}'); print('列表长度: ${fruits.length}'); // 添加元素 fruits.add('葡萄'); print('添加葡萄后: $fruits'); // 5. 映射(Map)操作 // Map 类似于其他语言中的字典或哈希表 Map<String, dynamic> person = { 'name': '张三', 'age': 25, 'city': '北京', 'isStudent': false }; print('\n=== 映射操作 ==='); print('个人信息: $person'); print('姓名: ${person['name']}'); print('年龄: ${person['age']}'); // 6. 函数调用 print('\n=== 函数调用 ==='); String greeting = createGreeting('Dart 开发者'); print(greeting); int sum = addNumbers(10, 20); print('10 + 20 = $sum'); // 可选参数函数调用 String fullGreeting = createFullGreeting('李四', title: '工程师'); print(fullGreeting); // 7. 控制流语句 print('\n=== 控制流 ==='); // if-else 语句 if (version >= 3.0) { print('使用的是 Dart 3.0 或更高版本'); } else { print('使用的是较旧版本的 Dart'); } // for 循环 print('数字 1 到 5:'); for (int i = 1; i <= 5; i++) { print(' 数字: $i'); } // for-in 循环 print('遍历水果列表:'); for (String fruit in fruits) { print(' 水果: $fruit'); } // 8. 类和对象 print('\n=== 面向对象编程 ==='); // 创建对象实例 Student student = Student('王五', 20, 'S001'); student.introduce(); student.study('Dart 编程'); // 9. 异常处理 print('\n=== 异常处理 ==='); try { int result = divideNumbers(10, 0); print('结果: $result'); } catch (e) { print('捕获异常: $e'); } // 10. 异步编程示例(简单演示) print('\n=== 异步编程 ==='); print('开始异步操作...'); // 模拟异步操作 Future.delayed(Duration(seconds: 1), () { print('异步操作完成!'); }); // 11. 数学运算 print('\n=== 数学运算 ==='); print('随机数: ${Random().nextInt(100)}'); print('平方根 of 16: ${sqrt(16)}'); print('最大值 (10, 20): ${max(10, 20)}'); // 12. JSON 处理 print('\n=== JSON 处理 ==='); Map<String, dynamic> data = {'name': 'Dart', 'version': 3.2}; String jsonString = jsonEncode(data); print('JSON 字符串: $jsonString'); Map<String, dynamic> decodedData = jsonDecode(jsonString); print('解码后的数据: $decodedData'); print('\n程序执行完毕!'); } // 函数定义 - 创建问候语 // String 是返回类型,createGreeting 是函数名,name 是参数 String createGreeting(String name) { return '你好, $name! 欢迎学习 Dart!'; } // 函数定义 - 数字相加 int addNumbers(int a, int b) { return a + b; } // 带有可选命名参数的函数 // {} 表示命名参数,可以指定默认值 String createFullGreeting(String name, {String title = '先生'}) { return '你好, $title $name!'; } // 除法函数(用于演示异常处理) int divideNumbers(int a, int b) { if (b == 0) { throw Exception('除数不能为零'); } return a ~/ b; // ~/ 是整数除法运算符 } // 类定义 - 学生类 class Student { // 私有属性(以下划线开头) String _name; int _age; String _studentId; // 构造函数 // Dart 的构造函数语法简洁 Student(this._name, this._age, this._studentId); // Getter 方法 String get name => _name; int get age => _age; String get studentId => _studentId; // Setter 方法 set name(String newName) { if (newName.isNotEmpty) { _name = newName; } } // 实例方法 void introduce() { print('我是 $_name,今年 $_age 岁,学号是 $_studentId'); } void study(String subject) { print('$_name 正在学习 $subject'); } // 重写 toString 方法 @override String toString() { return 'Student{name: $_name, age: $_age, id: $_studentId}'; } } // 抽象类示例 abstract class Animal { String name; Animal(this.name); // 抽象方法 void makeSound(); // 具体方法 void sleep() { print('$name 正在睡觉'); } } // 继承示例 class Dog extends Animal { String breed; Dog(String name, this.breed) : super(name); @override void makeSound() { print('$name 汪汪叫'); } void fetch() { print('$name 去捡球'); } } // Mixin 示例(混入) mixin Flyable { void fly() { print('正在飞行'); } } class Bird extends Animal with Flyable { Bird(String name) : super(name); @override void makeSound() { print('$name 叽叽喳喳'); } } // 枚举示例 enum Color { red, green, blue, yellow } // 扩展方法示例(Dart 2.7+) extension StringExtension on String { String get reversed { return split('').reversed.join(''); } bool get isEmail { return contains('@') && contains('.'); } } /* 多行注释示例: Dart 语言特性总结: 1. 强类型语言,支持类型推断 2. 面向对象编程,支持类、继承、接口、混入 3. 函数式编程特性 4. 异步编程支持(Future、async/await) 5. 空安全(Null Safety) 6. 丰富的标准库 7. 跨平台支持(移动、Web、桌面、服务器) 8. 热重载开发体验 9. 强大的包管理系统(pub.dev) 10. Google 官方支持和维护 Dart 主要用途: - Flutter 移动应用开发 - Web 前端开发 - 服务器端开发 - 桌面应用开发 - 命令行工具开发 */
方法一:直接运行
-
打开命令行终端
- Windows:按
Win + R,输入cmd或powershell - macOS:按
Cmd + Space,搜索 "Terminal" - Linux:按
Ctrl + Alt + T
- Windows:按
-
导航到文件目录
cd "C:\Users\21558\Documents\WeChat Files\wxid_nwercn4twf1c22\FileStorage\File\2025-06\cxx" -
运行程序
dart hello.dart
方法二:编译后运行
# 编译为可执行文件
dart compile exe hello.dart
# Windows
.\hello.exe
# Linux/macOS
./hello
方法三:编译为 JavaScript
# 编译为 JavaScript(用于 Web)
dart compile js hello.dart
# 在 HTML 中使用
# <script src="hello.dart.js"></script>
方法四:使用 Dart 开发服务器
# 创建 Web 项目
dart create -t web hello_web
cd hello_web
# 启动开发服务器
dart run build_runner serve
# 访问 http://localhost:8080
方法五:交互式运行(REPL)
Dart 3.0+ 支持交互式模式:
# 启动 Dart REPL
dart repl
# 在交互式环境中执行代码
>>> print('Hello, World!');
Hello, World!
>>> var name = 'Dart';
>>> print('Hello, $name!');
Hello, Dart!
>>> :quit
Dart 程序结构详解
基本语法
// 1. 导入语句
import 'dart:core'; // 核心库(默认导入)
import 'dart:io'; // 输入输出库
import 'dart:math'; // 数学库
import 'dart:convert'; // 转换库(JSON等)
import 'package:http/http.dart' as http; // 第三方包
// 2. 主函数
void main() {
// 程序入口点
}
// 带参数的主函数
void main(List<String> arguments) {
print('命令行参数: $arguments');
}
// 异步主函数
Future<void> main() async {
await someAsyncOperation();
}
变量和类型
// 1. 变量声明
var name = 'Dart'; // 类型推断
String language = 'Dart'; // 显式类型
final version = 3.2; // 运行时常量
const pi = 3.14159; // 编译时常量
late String description; // 延迟初始化
// 2. 基本数据类型
int age = 25; // 整数
double height = 1.75; // 浮点数
num weight = 70.5; // 数字(int 或 double)
bool isStudent = true; // 布尔值
String message = 'Hello'; // 字符串
// 3. 空安全
String? nullableString; // 可空类型
String nonNullableString = 'Not null'; // 非空类型
// 空检查
if (nullableString != null) {
print(nullableString.length); // 安全访问
}
// 空断言
print(nullableString!.length); // 强制非空(危险)
// 空合并
String result = nullableString ?? 'Default value';
// 4. 字符串操作
String firstName = 'John';
String lastName = 'Doe';
// 字符串连接
String fullName = firstName + ' ' + lastName;
String interpolated = '$firstName $lastName';
String expression = '${firstName.toUpperCase()} ${lastName.toLowerCase()}';
// 多行字符串
String multiline = '''
这是一个
多行字符串
''';
// 原始字符串
String rawString = r'这是原始字符串 \n 不会转义';
集合类型
// 1. 列表(List)
List<int> numbers = [1, 2, 3, 4, 5];
var fruits = ['apple', 'banana', 'orange'];
List<String> emptyList = [];
List<String> fixedList = List.filled(3, 'item');
// 列表操作
numbers.add(6); // 添加元素
numbers.addAll([7, 8, 9]); // 添加多个元素
numbers.remove(1); // 移除元素
numbers.removeAt(0); // 移除指定位置元素
print(numbers.length); // 获取长度
print(numbers.isEmpty); // 检查是否为空
print(numbers.contains(5)); // 检查是否包含元素
// 列表推导式
var squares = [for (var i in numbers) i * i];
var evenNumbers = [for (var i in numbers) if (i % 2 == 0) i];
// 2. 集合(Set)
Set<String> uniqueFruits = {'apple', 'banana', 'orange'};
var numbers_set = <int>{1, 2, 3, 4, 5};
// 集合操作
uniqueFruits.add('grape');
uniqueFruits.remove('apple');
print(uniqueFruits.contains('banana'));
print(uniqueFruits.length);
// 集合运算
var set1 = {1, 2, 3};
var set2 = {3, 4, 5};
var union = set1.union(set2); // 并集
var intersection = set1.intersection(set2); // 交集
var difference = set1.difference(set2); // 差集
// 3. 映射(Map)
Map<String, int> ages = {
'Alice': 25,
'Bob': 30,
'Charlie': 35
};
var person = <String, dynamic>{
'name': 'John',
'age': 25,
'isStudent': false
};
// 映射操作
ages['David'] = 28; // 添加键值对
ages.remove('Alice'); // 移除键值对
print(ages.containsKey('Bob')); // 检查键是否存在
print(ages.containsValue(30)); // 检查值是否存在
print(ages.keys); // 获取所有键
print(ages.values); // 获取所有值
// 映射推导式
var squareMap = {for (var i in [1, 2, 3, 4, 5]) i: i * i};
函数定义
// 1. 基本函数
String greet(String name) {
return 'Hello, $name!';
}
// 简化语法(箭头函数)
String greetShort(String name) => 'Hello, $name!';
// 2. 可选参数
// 位置可选参数
String greetOptional(String name, [String? title]) {
if (title != null) {
return 'Hello, $title $name!';
}
return 'Hello, $name!';
}
// 命名可选参数
String greetNamed(String name, {String title = 'Mr.', int? age}) {
var greeting = 'Hello, $title $name!';
if (age != null) {
greeting += ' You are $age years old.';
}
return greeting;
}
// 必需的命名参数
String greetRequired({required String name, required String title}) {
return 'Hello, $title $name!';
}
// 3. 高阶函数
void executeFunction(void Function() callback) {
print('执行前');
callback();
print('执行后');
}
// 函数作为参数
List<T> mapList<T, R>(List<T> list, R Function(T) mapper) {
return list.map(mapper).toList();
}
// 4. 匿名函数和闭包
var multiply = (int a, int b) => a * b;
Function makeMultiplier(int factor) {
return (int value) => value * factor;
}
var doubler = makeMultiplier(2);
print(doubler(5)); // 输出: 10
// 5. 泛型函数
T getFirst<T>(List<T> list) {
return list.first;
}
void swap<T>(List<T> list, int i, int j) {
T temp = list[i];
list[i] = list[j];
list[j] = temp;
}
面向对象编程
// 1. 基本类定义
class Person {
// 属性
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.baby(this.name) : age = 0;
Person.fromJson(Map<String, dynamic> json)
: name = json['name'],
age = json['age'];
// 方法
void introduce() {
print('我是 $name,今年 $age 岁');
}
// Getter 和 Setter
String get description => '$name ($age 岁)';
set newAge(int age) {
if (age >= 0) {
this.age = age;
}
}
// 重写方法
@override
String toString() => 'Person{name: $name, age: $age}';
}
// 2. 继承
class Student extends Person {
String school;
List<String> subjects;
Student(String name, int age, this.school, this.subjects)
: super(name, age);
@override
void introduce() {
super.introduce();
print('我在 $school 学习');
}
void study(String subject) {
print('$name 正在学习 $subject');
}
}
// 3. 抽象类
abstract class Animal {
String name;
Animal(this.name);
// 抽象方法
void makeSound();
// 具体方法
void sleep() {
print('$name 正在睡觉');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void makeSound() {
print('$name 汪汪叫');
}
}
// 4. 接口(隐式接口)
class Flyable {
void fly() {
print('正在飞行');
}
}
class Bird extends Animal implements Flyable {
Bird(String name) : super(name);
@override
void makeSound() {
print('$name 叽叽喳喳');
}
@override
void fly() {
print('$name 正在飞行');
}
}
// 5. Mixin(混入)
mixin Swimmer {
void swim() {
print('正在游泳');
}
}
mixin Walker {
void walk() {
print('正在走路');
}
}
class Duck extends Animal with Swimmer, Walker {
Duck(String name) : super(name);
@override
void makeSound() {
print('$name 嘎嘎叫');
}
}
// 6. 枚举
enum Color {
red,
green,
blue,
yellow;
// 枚举方法
String get displayName {
switch (this) {
case Color.red:
return '红色';
case Color.green:
return '绿色';
case Color.blue:
return '蓝色';
case Color.yellow:
return '黄色';
}
}
}
// 增强枚举(Dart 2.17+)
enum Planet {
mercury(3.303e+23, 2.4397e6),
venus(4.869e+24, 6.0518e6),
earth(5.976e+24, 6.37814e6);
const Planet(this.mass, this.radius);
final double mass; // 质量(千克)
final double radius; // 半径(米)
double get surfaceGravity => 6.67300E-11 * mass / (radius * radius);
}
异步编程
// 1. Future 基础
Future<String> fetchData() async {
// 模拟网络请求
await Future.delayed(Duration(seconds: 2));
return '数据获取成功';
}
// 2. async/await
void main() async {
print('开始获取数据...');
try {
String data = await fetchData();
print(data);
} catch (e) {
print('错误: $e');
}
print('程序结束');
}
// 3. 并发执行
Future<void> concurrentExample() async {
// 并发执行多个异步操作
var future1 = fetchData();
var future2 = fetchData();
var future3 = fetchData();
// 等待所有操作完成
var results = await Future.wait([future1, future2, future3]);
print('所有结果: $results');
}
// 4. Stream(流)
Stream<int> countStream(int max) async* {
for (int i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
void streamExample() async {
await for (int value in countStream(5)) {
print('当前值: $value');
}
}
// 5. 错误处理
Future<String> riskyOperation() async {
await Future.delayed(Duration(seconds: 1));
throw Exception('操作失败');
}
void errorHandlingExample() async {
try {
String result = await riskyOperation();
print(result);
} on Exception catch (e) {
print('捕获异常: $e');
} catch (e) {
print('捕获其他错误: $e');
} finally {
print('清理资源');
}
}
扩展方法
// 为现有类型添加方法
extension StringExtensions on String {
// 判断是否为邮箱
bool get isEmail {
return RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(this);
}
// 首字母大写
String get capitalize {
if (isEmpty) return this;
return this[0].toUpperCase() + substring(1).toLowerCase();
}
// 反转字符串
String get reversed {
return split('').reversed.join('');
}
}
extension ListExtensions<T> on List<T> {
// 安全获取元素
T? safeGet(int index) {
if (index >= 0 && index < length) {
return this[index];
}
return null;
}
// 分块
List<List<T>> chunk(int size) {
List<List<T>> chunks = [];
for (int i = 0; i < length; i += size) {
chunks.add(sublist(i, (i + size > length) ? length : i + size));
}
return chunks;
}
}
// 使用扩展方法
void extensionExample() {
String email = 'user@example.com';
print(email.isEmail); // true
print('hello'.capitalize); // Hello
print('dart'.reversed); // trad
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
print(numbers.safeGet(10)); // null
print(numbers.chunk(3)); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
}
包管理器 Pub
Pub 简介
Pub 是 Dart 的官方包管理器,类似于 Node.js 的 npm 或 Python 的 pip。它用于管理 Dart 项目的依赖关系。
基本命令
# 创建新项目
dart create my_project
dart create -t console my_cli_app
dart create -t web my_web_app
dart create -t package my_package
# 获取依赖
dart pub get
# 升级依赖
dart pub upgrade
dart pub upgrade package_name
# 添加依赖
dart pub add http
dart pub add --dev test
# 移除依赖
dart pub remove http
# 发布包
dart pub publish
# 运行脚本
dart pub run
dart pub run build_runner build
# 分析代码
dart pub deps
dart analyze
# 格式化代码
dart format .
# 运行测试
dart test
pubspec.yaml 配置
name: my_dart_app
description: 一个示例 Dart 应用程序
version: 1.0.0
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
# HTTP 客户端
http: ^1.1.0
# JSON 序列化
json_annotation: ^4.8.1
# 日期时间处理
intl: ^0.18.1
# 状态管理(如果是 Flutter 项目)
# provider: ^6.0.5
# 数据库
# sqflite: ^2.3.0
dev_dependencies:
# 测试框架
test: ^1.24.0
# 代码生成
build_runner: ^2.4.7
json_serializable: ^6.7.1
# 代码分析
lints: ^3.0.0
# 可执行文件
executables:
my_app: main
# 资源文件
# flutter:
# assets:
# - assets/images/
# - assets/data/
# 发布配置
publish_to: 'none' # 防止意外发布到 pub.dev
# 依赖覆盖(用于开发)
dependency_overrides:
# some_package:
# path: ../local_package
常用包推荐
# HTTP 客户端
dart pub add http # 官方 HTTP 客户端
dart pub add dio # 功能丰富的 HTTP 客户端
# JSON 处理
dart pub add json_annotation json_serializable
dart pub add --dev build_runner
# 日期时间
dart pub add intl # 国际化和日期格式化
# 工具库
dart pub add collection # 集合工具
dart pub add path # 路径操作
dart pub add crypto # 加密算法
dart pub add uuid # UUID 生成
# 测试
dart pub add --dev test # 测试框架
dart pub add --dev mockito # 模拟对象
# 代码质量
dart pub add --dev lints # 代码规范
dart pub add --dev coverage # 代码覆盖率
# 命令行工具
dart pub add args # 命令行参数解析
dart pub add cli_util # CLI 工具
# 数据库
dart pub add sqlite3 # SQLite 数据库
dart pub add postgres # PostgreSQL 客户端
# Web 开发
dart pub add shelf # Web 服务器框架
dart pub add shelf_router # 路由
创建和发布包
# 创建包项目
dart create -t package my_awesome_package
cd my_awesome_package
# 编辑 lib/my_awesome_package.dart
# 编辑 pubspec.yaml
# 编写测试 test/my_awesome_package_test.dart
# 编写文档 README.md, CHANGELOG.md
# 验证包
dart pub publish --dry-run
# 发布包
dart pub publish
开发工具配置
1. Visual Studio Code(推荐)
安装扩展:
- Dart
- Flutter(如果开发 Flutter 应用)
- Dart Data Class Generator
- Pubspec Assist
- Error Lens
配置文件 (.vscode/settings.json):
{
"dart.flutterSdkPath": "/path/to/flutter",
"dart.debugExternalPackageLibraries": true,
"dart.debugSdkLibraries": false,
"dart.lineLength": 80,
"dart.insertArgumentPlaceholders": false,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"dart.previewLsp": true
}
调试配置 (.vscode/launch.json):
{
"version": "0.2.0",
"configurations": [
{
"name": "Dart",
"type": "dart",
"request": "launch",
"program": "bin/main.dart"
},
{
"name": "Dart: Run Tests",
"type": "dart",
"request": "launch",
"program": "test/"
}
]
}
2. IntelliJ IDEA / Android Studio
安装插件:
- Dart
- Flutter(如果需要)
配置 Dart SDK:
- File → Settings → Languages & Frameworks → Dart
- 勾选 "Enable Dart support"
- 设置 Dart SDK 路径
3. 其他编辑器
Vim/Neovim:
" 安装 coc-flutter 插件
:CocInstall coc-flutter
" 或者使用 vim-lsp
Plug 'prabirshrestha/vim-lsp'
Plug 'dart-lang/dart-vim-plugin'
Emacs:
;; 安装 lsp-dart
(use-package lsp-dart
:ensure t
:hook (dart-mode . lsp))
4. 代码格式化和分析
analysis_options.yaml 配置:
include: package:lints/recommended.yaml
linter:
rules:
# 启用额外规则
prefer_single_quotes: true
sort_constructors_first: true
sort_unnamed_constructors_first: true
always_declare_return_types: true
avoid_print: false
# 禁用某些规则
# avoid_print: false
# prefer_const_constructors: false
analyzer:
exclude:
- "**/*.g.dart"
- "**/*.freezed.dart"
strong-mode:
implicit-casts: false
implicit-dynamic: false
errors:
invalid_annotation_target: ignore
格式化配置:
# 格式化单个文件
dart format lib/main.dart
# 格式化整个项目
dart format .
# 检查格式但不修改
dart format --output=none --set-exit-if-changed .
# 设置行长度
dart format --line-length=120 .
常见问题解决
1. 安装问题
问题:无法下载 Dart SDK
解决方案:
# 使用镜像源(中国用户)
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
# 或者设置代理
export http_proxy=http://proxy.company.com:8080
export https_proxy=http://proxy.company.com:8080
问题:PATH 环境变量配置错误
解决方案:
# 检查当前 PATH
echo $PATH
# 临时添加到 PATH
export PATH="$PATH:/path/to/dart-sdk/bin"
# 永久添加到 PATH(Linux/macOS)
echo 'export PATH="$PATH:/path/to/dart-sdk/bin"' >> ~/.bashrc
source ~/.bashrc
2. 依赖问题
问题:pub get 失败
解决方案:
# 清理缓存
dart pub cache clean
# 删除 pubspec.lock 重新获取
rm pubspec.lock
dart pub get
# 使用详细输出查看错误
dart pub get --verbose
问题:版本冲突
解决方案:
# 在 pubspec.yaml 中使用 dependency_overrides
dependency_overrides:
some_package: ^2.0.0
3. 编译问题
问题:编译错误
解决方案:
# 分析代码
dart analyze
# 检查类型错误
dart analyze --fatal-infos
# 修复格式问题
dart format .
问题:内存不足
解决方案:
# 增加 Dart VM 内存限制
dart --old_gen_heap_size=4096 compile exe main.dart
4. 运行时问题
问题:找不到文件
解决方案:
// 使用相对路径
import 'dart:io';
void main() {
var currentDir = Directory.current.path;
print('当前目录: $currentDir');
var file = File('data.txt');
if (file.existsSync()) {
print('文件存在');
} else {
print('文件不存在');
}
}
问题:编码问题
解决方案:
import 'dart:convert';
import 'dart:io';
void main() {
// 指定编码读取文件
var file = File('chinese.txt');
var contents = file.readAsStringSync(encoding: utf8);
print(contents);
}
5. 性能问题
问题:程序运行缓慢
解决方案:
# 使用 AOT 编译
dart compile exe -o myapp main.dart
# 启用优化
dart compile exe --optimization-level=2 main.dart
# 分析性能
dart run --observe main.dart
# 然后访问 Observatory URL 进行性能分析
进阶开发指南
1. 测试
单元测试:
// test/calculator_test.dart
import 'package:test/test.dart';
import '../lib/calculator.dart';
void main() {
group('Calculator', () {
late Calculator calculator;
setUp(() {
calculator = Calculator();
});
test('addition', () {
expect(calculator.add(2, 3), equals(5));
expect(calculator.add(-1, 1), equals(0));
});
test('division by zero', () {
expect(() => calculator.divide(10, 0), throwsA(isA<ArgumentError>()));
});
});
}
集成测试:
// test/integration_test.dart
import 'package:test/test.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
void main() {
group('API Integration Tests', () {
test('fetch user data', () async {
var response = await http.get(
Uri.parse('https://jsonplaceholder.typicode.com/users/1'),
);
expect(response.statusCode, equals(200));
var userData = jsonDecode(response.body);
expect(userData['id'], equals(1));
expect(userData['name'], isNotEmpty);
});
});
}
运行测试:
# 运行所有测试
dart test
# 运行特定测试文件
dart test test/calculator_test.dart
# 运行带标签的测试
dart test -t "unit"
# 生成覆盖率报告
dart test --coverage=coverage
genhtml coverage/lcov.info -o coverage/html
2. 代码生成
JSON 序列化:
// lib/models/user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User {
final int id;
final String name;
final String email;
User({required this.id, required this.name, required this.email});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
生成代码:
# 一次性生成
dart run build_runner build
# 监听文件变化自动生成
dart run build_runner watch
# 删除生成的文件
dart run build_runner clean
3. 性能优化
内存优化:
// 使用对象池
class ObjectPool<T> {
final List<T> _pool = [];
final T Function() _factory;
ObjectPool(this._factory);
T acquire() {
if (_pool.isNotEmpty) {
return _pool.removeLast();
}
return _factory();
}
void release(T object) {
_pool.add(object);
}
}
// 使用 const 构造函数
class ImmutablePoint {
final int x, y;
const ImmutablePoint(this.x, this.y);
}
// 使用工厂构造函数实现单例
class Singleton {
static final Singleton _instance = Singleton._internal();
factory Singleton() => _instance;
Singleton._internal();
}
异步优化:
// 使用 Isolate 进行 CPU 密集型计算
import 'dart:isolate';
Future<int> heavyComputation(int n) async {
return await Isolate.run(() {
int result = 0;
for (int i = 0; i < n; i++) {
result += i;
}
return result;
});
}
// 使用 Stream 处理大量数据
Stream<String> processLargeFile(String filePath) async* {
var file = File(filePath);
await for (var line in file.openRead().transform(utf8.decoder).transform(LineSplitter())) {
yield line.toUpperCase();
}
}
4. 错误处理和日志
结构化错误处理:
// 自定义异常类
class NetworkException implements Exception {
final String message;
final int? statusCode;
NetworkException(this.message, [this.statusCode]);
@override
String toString() => 'NetworkException: $message (Status: $statusCode)';
}
class ValidationException implements Exception {
final Map<String, String> errors;
ValidationException(this.errors);
@override
String toString() => 'ValidationException: $errors';
}
// 结果类型
abstract class Result<T> {
const Result();
}
class Success<T> extends Result<T> {
final T data;
const Success(this.data);
}
class Failure<T> extends Result<T> {
final Exception exception;
const Failure(this.exception);
}
// 使用示例
Future<Result<User>> fetchUser(int id) async {
try {
var response = await http.get(Uri.parse('https://api.example.com/users/$id'));
if (response.statusCode == 200) {
var userData = jsonDecode(response.body);
return Success(User.fromJson(userData));
} else {
return Failure(NetworkException('Failed to fetch user', response.statusCode));
}
} catch (e) {
return Failure(NetworkException('Network error: $e'));
}
}
日志系统:
import 'dart:developer' as developer;
enum LogLevel { debug, info, warning, error }
class Logger {
final String name;
Logger(this.name);
void log(LogLevel level, String message, [Object? error, StackTrace? stackTrace]) {
var timestamp = DateTime.now().toIso8601String();
var levelStr = level.toString().split('.').last.toUpperCase();
developer.log(
'[$timestamp] $levelStr: $message',
name: name,
error: error,
stackTrace: stackTrace,
);
}
void debug(String message) => log(LogLevel.debug, message);
void info(String message) => log(LogLevel.info, message);
void warning(String message) => log(LogLevel.warning, message);
void error(String message, [Object? error, StackTrace? stackTrace]) =>
log(LogLevel.error, message, error, stackTrace);
}
// 使用示例
final logger = Logger('MyApp');
void main() {
logger.info('应用启动');
try {
// 一些操作
} catch (e, stackTrace) {
logger.error('操作失败', e, stackTrace);
}
}
与其他语言对比
Dart vs JavaScript
| 特性 | Dart | JavaScript |
|---|---|---|
| 类型系统 | 静态类型,空安全 | 动态类型 |
| 编译 | AOT/JIT 编译 | 解释执行 |
| 面向对象 | 基于类的 OOP | 基于原型的 OOP |
| 异步编程 | async/await, Future | async/await, Promise |
| 包管理 | pub | npm |
| 运行环境 | Dart VM, Web, Native | 浏览器, Node.js |
| 学习曲线 | 中等 | 容易 |
| 性能 | 高(AOT编译) | 中等 |
Dart vs Java
| 特性 | Dart | Java |
|---|---|---|
| 语法 | 简洁现代 | 冗长传统 |
| 类型推断 | 强大的类型推断 | 有限的类型推断 |
| 空安全 | 内置空安全 | 需要注解 |
| 函数式编程 | 支持 | 有限支持 |
| 编译目标 | 多平台 | JVM |
| 启动速度 | 快 | 慢 |
| 内存使用 | 低 | 高 |
Dart vs Swift
| 特性 | Dart | Swift |
|---|---|---|
| 平台 | 跨平台 | 主要 Apple 平台 |
| 语法 | C风格 | 现代简洁 |
| 可选类型 | 空安全 | 可选类型 |
| 内存管理 | 垃圾回收 | ARC |
| 生态系统 | 快速增长 | 成熟 |
| 学习曲线 | 平缓 | 中等 |
| 性能 | 高 | 很高 |
Dart vs Kotlin
| 特性 | Dart | Kotlin |
|---|---|---|
| 目标平台 | 多平台 | JVM, Android, Native |
| 语法 | 简洁 | 非常简洁 |
| 互操作性 | 有限 | 与 Java 100% 兼容 |
| 编译速度 | 快 | 中等 |
| 生态系统 | 新兴 | 成熟 |
| 主要用途 | Flutter 开发 | Android 开发 |
| 学习成本 | 低 | 中等 |
Dart vs Python
| 特性 | Dart | Python |
|---|---|---|
| 类型系统 | 静态类型 | 动态类型 |
| 性能 | 高 | 中等 |
| 语法 | C风格 | 简洁优雅 |
| 生态系统 | 新兴但快速增长 | 非常成熟 |
| 学习曲线 | 平缓 | 非常平缓 |
| 主要用途 | 应用开发 | 通用编程 |
| 并发 | 异步编程 | 多线程/异步 |
总结
Dart 是一种现代、高效的编程语言,特别适合:
- 跨平台应用开发:使用 Flutter 开发移动、Web、桌面应用
- Web 前端开发:编译为 JavaScript 运行在浏览器中
- 服务器端开发:高性能的后端服务和 API
- 命令行工具:快速开发 CLI 应用
- 快速原型开发:简洁的语法和热重载功能
Dart 的优势
- 现代语言设计:简洁、表达力强的语法
- 强类型系统:编译时错误检查,空安全保护
- 高性能:AOT 编译,优化的运行时
- 跨平台:一套代码,多平台运行
- 优秀的工具链:强大的 IDE 支持,丰富的开发工具
- 活跃的生态:快速增长的包生态系统
- Google 支持:官方维护,持续更新
- 热重载:快速的开发迭代体验
Dart 的特色
- 空安全:编译时防止空指针异常
- 异步编程:内置的 Future 和 Stream 支持
- Mixin 支持:灵活的代码复用机制
- 扩展方法:为现有类型添加新功能
- 强大的类型推断:减少样板代码
- 函数式编程:支持高阶函数和闭包
- 代码生成:自动生成样板代码
- 优秀的包管理:简单易用的 pub 包管理器
完整流程总结
- 安装 Dart SDK:选择合适的安装方法(官方安装器、包管理器、或 Flutter SDK)
- 验证安装:
dart --version和创建测试项目 - 编写程序:创建
.dart文件 - 运行程序:
dart run或dart filename.dart - 管理依赖:使用
pub管理第三方包 - 配置开发环境:设置 IDE 和开发工具
- 编写测试:使用
test包编写单元测试 - 代码质量:使用
dart analyze和dart format - 构建部署:编译为可执行文件或 Web 应用
通过本指南,你应该能够成功安装 Dart 并开始你的 Dart 开发之旅。Dart 的设计理念是让开发变得简单高效,希望你在学习和使用 Dart 的过程中能够体验到这种便利!
浙公网安备 33010602011771号