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); // 使用 ?. 安全访问

操作符与控制流程

常用操作符

  • 算术:+-*/~/(整除)、%
  • 比较:==!=><>=<=
  • 逻辑:&&||!
  • 类型判断:isis!
  • 三元操作符: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 采用单线程事件循环机制,通过 Futureasync/awaitStream 处理异步操作。

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 应用逻辑的核心能力。建议进一步学习:

  • 集合操作(mapwherereduce 等)
  • 扩展方法(Extension methods)
  • 空安全高级用法
  • 包管理(pubspec.yaml 与第三方库)
  • 函数式编程技巧

Dart 是一门平衡了开发效率与运行性能的语言,随着 Flutter 生态的壮大,它正在快速成为跨平台开发的首选语言。现在就打开你的编辑器,开始用 Dart 构建你的第一个 Flutter 应用吧!