GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

软件研发 --- hello world 项目 之 跨平台原生 Dart

Dart 安装运行完整指南

目录

  1. Dart 简介
  2. 安装 Dart SDK
  3. 验证安装
  4. 运行 Hello World 程序
  5. Dart 程序结构详解
  6. 包管理器 Pub
  7. 开发工具配置
  8. 常见问题解决
  9. 进阶开发指南
  10. 与其他语言对比

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

手动安装:

  1. 访问 https://dart.dev/get-dart
  2. 下载 Windows 版本的 Dart SDK
  3. 解压到目录(如 C:\dart-sdk
  4. 添加 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 前端开发
- 服务器端开发
- 桌面应用开发
- 命令行工具开发
*/

 

 

方法一:直接运行

  1. 打开命令行终端

    • Windows:按 Win + R,输入 cmd 或 powershell
    • macOS:按 Cmd + Space,搜索 "Terminal"
    • Linux:按 Ctrl + Alt + T
  2. 导航到文件目录

    cd "C:\Users\21558\Documents\WeChat Files\wxid_nwercn4twf1c22\FileStorage\File\2025-06\cxx"
    
  3. 运行程序

    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:

  1. File → Settings → Languages & Frameworks → Dart
  2. 勾选 "Enable Dart support"
  3. 设置 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

特性DartJavaScript
类型系统 静态类型,空安全 动态类型
编译 AOT/JIT 编译 解释执行
面向对象 基于类的 OOP 基于原型的 OOP
异步编程 async/await, Future async/await, Promise
包管理 pub npm
运行环境 Dart VM, Web, Native 浏览器, Node.js
学习曲线 中等 容易
性能 高(AOT编译) 中等

Dart vs Java

特性DartJava
语法 简洁现代 冗长传统
类型推断 强大的类型推断 有限的类型推断
空安全 内置空安全 需要注解
函数式编程 支持 有限支持
编译目标 多平台 JVM
启动速度
内存使用

Dart vs Swift

特性DartSwift
平台 跨平台 主要 Apple 平台
语法 C风格 现代简洁
可选类型 空安全 可选类型
内存管理 垃圾回收 ARC
生态系统 快速增长 成熟
学习曲线 平缓 中等
性能 很高

Dart vs Kotlin

特性DartKotlin
目标平台 多平台 JVM, Android, Native
语法 简洁 非常简洁
互操作性 有限 与 Java 100% 兼容
编译速度 中等
生态系统 新兴 成熟
主要用途 Flutter 开发 Android 开发
学习成本 中等

Dart vs Python

特性DartPython
类型系统 静态类型 动态类型
性能 中等
语法 C风格 简洁优雅
生态系统 新兴但快速增长 非常成熟
学习曲线 平缓 非常平缓
主要用途 应用开发 通用编程
并发 异步编程 多线程/异步

总结

Dart 是一种现代、高效的编程语言,特别适合:

  • 跨平台应用开发:使用 Flutter 开发移动、Web、桌面应用
  • Web 前端开发:编译为 JavaScript 运行在浏览器中
  • 服务器端开发:高性能的后端服务和 API
  • 命令行工具:快速开发 CLI 应用
  • 快速原型开发:简洁的语法和热重载功能

Dart 的优势

  1. 现代语言设计:简洁、表达力强的语法
  2. 强类型系统:编译时错误检查,空安全保护
  3. 高性能:AOT 编译,优化的运行时
  4. 跨平台:一套代码,多平台运行
  5. 优秀的工具链:强大的 IDE 支持,丰富的开发工具
  6. 活跃的生态:快速增长的包生态系统
  7. Google 支持:官方维护,持续更新
  8. 热重载:快速的开发迭代体验

Dart 的特色

  1. 空安全:编译时防止空指针异常
  2. 异步编程:内置的 Future 和 Stream 支持
  3. Mixin 支持:灵活的代码复用机制
  4. 扩展方法:为现有类型添加新功能
  5. 强大的类型推断:减少样板代码
  6. 函数式编程:支持高阶函数和闭包
  7. 代码生成:自动生成样板代码
  8. 优秀的包管理:简单易用的 pub 包管理器

完整流程总结

  1. 安装 Dart SDK:选择合适的安装方法(官方安装器、包管理器、或 Flutter SDK)
  2. 验证安装dart --version 和创建测试项目
  3. 编写程序:创建 .dart 文件
  4. 运行程序dart run 或 dart filename.dart
  5. 管理依赖:使用 pub 管理第三方包
  6. 配置开发环境:设置 IDE 和开发工具
  7. 编写测试:使用 test 包编写单元测试
  8. 代码质量:使用 dart analyze 和 dart format
  9. 构建部署:编译为可执行文件或 Web 应用

通过本指南,你应该能够成功安装 Dart 并开始你的 Dart 开发之旅。Dart 的设计理念是让开发变得简单高效,希望你在学习和使用 Dart 的过程中能够体验到这种便利!

posted on 2025-06-16 07:59  GKLBB  阅读(116)  评论(0)    收藏  举报