Dart 语言基础:Flutter 开发前置技能
FreeGuideOnline
最新
2026-06-13
Dart 语言基础:Flutter 开发前置技能
什么是 Dart?
Dart 是由 Google 开发的通用编程语言,既是构建 Flutter 应用的官方语言,也可用于服务器、命令行工具和 Web 开发。它采用类 C 语法风格,既支持即时编译(JIT)提升开发体验,也支持预编译(AOT)生成高性能原生代码。掌握 Dart 是高效开发 Flutter 应用的第一步。
环境搭建与第一行代码
安装 Dart SDK
- Windows/macOS/Linux:访问 dart.dev/get-dart 下载安装包或通过包管理器安装。
- 直接使用 Flutter SDK:Flutter SDK 内已包含 Dart,无需单独安装,只需确保
flutter doctor正常运行即可。
验证安装
打开终端,输入:
dart --version
若看到版本号信息,说明安装成功。
编写与运行
创建 hello.dart 文件:
void main() {
print('Hello, Dart!');
}
运行:
dart hello.dart
终端将输出 Hello, Dart!。main() 函数是 Dart 程序的入口点。
变量与基础数据类型
变量声明
Dart 是强类型语言,但支持类型推断。常用声明方式:
- 显式类型:
String name = 'Flutter'; - 类型推断:
var name = 'Flutter';编译器自动推断为String。 - 动态类型:
dynamic anything = 42;可在运行时改变类型,但会失去类型检查优势。 - 常量声明:
final:运行时常量,赋值后不可变。const:编译时常量,值必须在编译时确定。
final currentTime = DateTime.now(); // 正确
// const currentTime = DateTime.now(); // 错误,DateTime.now() 是运行时值
内置数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
int |
整数 | int age = 30; |
double |
浮点数 | double price = 9.99; |
num |
数字(int 或 double) | num value = 10; |
String |
字符串 | String greeting = 'Hello'; |
bool |
布尔值 | bool isActive = true; |
List |
有序集合 | List<int> numbers = [1, 2, 3]; |
Set |
无序不重复集合 | Set<String> names = {'Alice', 'Bob'}; |
Map |
键值对 | Map<String, int> ages = {'Alice': 30}; |
null |
空值 | String? nullableName;(可空类型) |
字符串插值与多行字符串:
var food = 'bread';
print('I want some $food, please!');
print('Sum: ${2 + 3}'); // 表达式需用 ${}
var poem = '''
第一行
第二行
第三行
''';
可空类型与空安全
Dart 默认启用了空安全(null safety),变量默认不可为 null,除非显式标记为可空类型(在类型后加 ?)。
String nonNullable = 'abc';
// nonNullable = null; // 编译错误
String? nullable = 'abc';
nullable = null; // 允许
print(nullable?.length); // 使用 ?. 安全访问
操作符与控制流程
常用操作符
- 算术:
+、-、*、/、~/(整除)、% - 比较:
==、!=、>、<、>=、<= - 逻辑:
&&、||、! - 类型判断:
is、is! - 三元操作符:
condition ? expr1 : expr2 - 空值感知操作符:
??:若左操作数为null,返回右操作数。??=:若变量为null,则将其赋值为右操作数。
String? name;
print(name ?? 'Guest'); // 输出 Guest
name ??= 'Default';
条件语句
if (score >= 90) {
print('A');
} else if (score >= 80) {
print('B');
} else {
print('C');
}
循环语句
// for 循环
for (var i = 0; i < 5; i++) {
print(i);
}
// for-in 遍历集合
var items = [1, 2, 3];
for (var item in items) {
print(item);
}
// while 循环
while (condition) { ... }
// do-while 循环
do { ... } while (condition);
函数
函数定义
// 有返回值
int add(int a, int b) {
return a + b;
}
// 箭头语法(仅一个表达式)
int add(int a, int b) => a + b;
可选参数
- 命名可选参数:使用
{}包裹,调用时需指定参数名。 - 位置可选参数:使用
[]包裹。
// 命名可选参数,可设置默认值
void greet(String name, {String greeting = 'Hello', String? punctuation}) {
print('$greeting, $name${punctuation ?? '!'}');
}
greet('Alice'); // Hello, Alice!
greet('Bob', greeting: 'Hi', punctuation: '.'); // Hi, Bob.
// 位置可选参数
String describe(String name, [int age = 0]) {
return '$name is $age years old.';
}
函数作为一等公民
函数可以作为参数传递、赋值给变量或作为返回值。
void printResult(int Function(int, int) operation, int a, int b) {
print(operation(a, b));
}
printResult(add, 5, 3); // 传入上面定义的 add 函数
匿名函数与 lambda
var list = [1, 2, 3];
list.forEach((item) {
print(item * 2);
});
// 箭头形式
list.forEach((item) => print(item * 2));
类与对象
类定义与实例化
class Person {
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.anonymous() {
name = 'Unknown';
age = 0;
}
void introduce() {
print('My name is $name, I am $age years old.');
}
}
void main() {
var alice = Person('Alice', 30);
alice.introduce();
var unknown = Person.anonymous();
unknown.introduce();
}
继承
Dart 支持单继承,使用 extends 关键字。
class Student extends Person {
String school;
Student(String name, int age, this.school) : super(name, age);
@override
void introduce() {
super.introduce(); // 调用父类方法
print('I study at $school.');
}
}
混入(Mixins)
混入用于复用代码,通过 with 关键字实现,可避免多重继承的复杂性。
mixin Logger {
void log(String message) {
print('[LOG] $message');
}
}
class Animal with Logger {
void makeSound() {
log('Sound made');
}
}
抽象类与接口
- 抽象类:使用
abstract关键字,可定义未实现的方法。 - 隐式接口:每个类都隐式定义了一个接口,可实现多个接口。
abstract class Animal {
void makeSound(); // 抽象方法
}
class Dog implements Animal {
@override
void makeSound() {
print('Woof!');
}
}
泛型
泛型提供类型安全并减少重复代码。
// 泛型函数
T first<T>(List<T> items) {
return items[0];
}
// 泛型类
class Box<T> {
T value;
Box(this.value);
}
var intBox = Box<int>(42);
var stringBox = Box<String>('hello');
异步编程
Dart 采用单线程事件循环机制,通过 Future、async/await 和 Stream 处理异步操作。
Future 与 async/await
// 模拟网络请求
Future<String> fetchUserData() {
return Future.delayed(Duration(seconds: 2), () => '用户数据');
}
void main() async {
print('开始获取数据...');
var data = await fetchUserData();
print(data);
print('完成');
}
错误处理:
try {
var data = await fetchUserData();
} catch (e) {
print('发生错误: $e');
} finally {
print('操作结束');
}
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(3)) {
print(value);
}
}
常用核心库
dart:core:基础类型、集合、数学函数等,自动导入。dart:async:异步支持。dart:convert:JSON 编解码等。dart:math:数学常量和函数。dart:io:文件和网络 I/O(服务端使用)。
示例:JSON 解析
import 'dart:convert';
void main() {
var jsonStr = '{"name": "Alice", "age": 30}';
var user = jsonDecode(jsonStr);
print(user['name']); // Alice
}
总结与后续
掌握以上 Dart 基础语法后,你已经具备编写 Flutter 应用逻辑的核心能力。建议进一步学习:
- 集合操作(
map、where、reduce等) - 扩展方法(Extension methods)
- 空安全高级用法
- 包管理(
pubspec.yaml与第三方库) - 函数式编程技巧
Dart 是一门平衡了开发效率与运行性能的语言,随着 Flutter 生态的壮大,它正在快速成为跨平台开发的首选语言。现在就打开你的编辑器,开始用 Dart 构建你的第一个 Flutter 应用吧!