Dart 3.5+ 语言基础

Dart 3.5 是 Flutter 3.27 的基础语言,带来了许多现代化特性。掌握 Dart 语言是学习 Flutter 的第一步。本教程将介绍 Dart 3.5+ 的核心概念和语法。

提示:Dart 3.5+ 引入了 Records、Patterns、Switch 表达式等现代化特性,代码更加简洁和类型安全。

1. 变量声明

Dart 提供了多种声明变量的方式:

使用 var 声明

// 使用 var 自动推断类型
var name = 'Flutter';
var age = 5;

// name 的类型是 String
// age 的类型是 int

显式指定类型

String language = 'Dart';
int version = 3;
bool isActive = true;
double pi = 3.14159;

使用 dynamic 和 late

// dynamic 可以是任何类型
dynamic value = 100;
value = 'Hello';  // 可以重新赋值为不同类型

// late 延迟初始化
late String description;

void init() {
  description = '这是一个延迟初始化的变量';
}

2. 数据类型

Dart 的基本数据类型包括:

  • 数值类型:int(整数)、double(浮点数)
  • 字符串:String
  • 布尔值:bool
  • 列表:List
  • 映射:Map
  • Runes:字符串中的 Unicode 字符
  • Symbols:程序中声明的操作符或标识符

数据类型示例

// 数值类型
int count = 10;
double price = 19.99;

// 字符串
String greeting = 'Hello, World!';
String multiline = '''
这是一个
多行字符串
''';

// 布尔值
bool isFlutter = true;
bool isNative = false;

// 列表
List fruits = ['Apple', 'Banana', 'Orange'];
List numbers = [1, 2, 3, 4, 5];

// 映射
Map scores = {
  'Alice': 95,
  'Bob': 87,
  'Charlie': 92
};

3. 函数

Dart 中的函数是一等公民,可以作为参数传递,也可以作为返回值。

基本函数定义

// 基本函数
void sayHello() {
  print('Hello, Dart!');
}

// 带参数的函数
String greet(String name) {
  return 'Hello, $name!';
}

// 可选参数
void printInfo(String name, [int? age]) {
  print('Name: $name');
  if (age != null) {
    print('Age: $age');
  }
}

// 命名参数
void createUser({
  required String name,
  int age = 0,
  String email = ''
}) {
  print('Creating user: $name');
}

// 箭头函数(单行函数)
int add(int a, int b) => a + b;

// 使用函数
sayHello();
print(greet('Flutter'));
printInfo('Alice');
printInfo('Bob', 30);
createUser(name: 'Alice', age: 25);
print(add(5, 3));  // 输出: 8

4. 类和对象

Dart 是面向对象的语言,一切皆对象。

类定义

class Person {
  // 属性
  String name;
  int age;

  // 构造函数
  Person(this.name, this.age);

  // 命名构造函数
  Person.fromMap(Map map)
      : name = map['name'],
        age = map['age'];

  // 方法
  void introduce() {
    print('Hello, I am $name, $age years old.');
  }

  // getter
  bool get isAdult => age >= 18;

  // setter
  set age(int value) {
    if (value > 0) {
      age = value;
    }
  }
}

// 使用类
void main() {
  var person = Person('Alice', 25);
  person.introduce();

  var person2 = Person.fromMap({'name': 'Bob', 'age': 30});
  person2.introduce();

  print(person.isAdult);  // true
}

5. 异步编程

Dart 提供了强大的异步编程支持。

Future 和 async/await

// 定义异步函数
Future fetchUserData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'User Data Loaded';
}

// 使用 async/await
void loadData() async {
  print('Loading...');
  String data = await fetchUserData();
  print(data);
}

// Future.then 方式
void loadDataAlternative() {
  fetchUserData().then((data) {
    print(data);
  }).catchError((error) {
    print('Error: $error');
  });
}

// 并发执行多个 Future
Future loadMultipleData() async {
  var results = await Future.wait([
    fetchUserData(),
    fetchUserData(),
    fetchUserData()
  ]);
  print('Loaded ${results.length} items');
}

Stream

// 创建 Stream
Stream numberStream() async* {
  for (int i = 1; i <= 5; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

// 监听 Stream
void listenToStream() {
  numberStream().listen(
    (number) => print('Received: $number'),
    onError: (error) => print('Error: $error'),
    onDone: () => print('Stream completed')
  );
}

6. 集合操作

Dart 提供了丰富的集合操作方法。

常用集合操作

void main() {
  List numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

  // 映射
  var doubled = numbers.map((n) => n * 2).toList();
  print(doubled);  // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

  // 过滤
  var evenNumbers = numbers.where((n) => n % 2 == 0).toList();
  print(evenNumbers);  // [2, 4, 6, 8, 10]

  // 归约
  var sum = numbers.reduce((a, b) => a + b);
  print(sum);  // 55

  // 排序
  var sorted = numbers.reversed.toList();
  print(sorted);  // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

  // 查找
  var firstEven = numbers.firstWhere((n) => n % 2 == 0);
  print(firstEven);  // 2

  // 检查
  var hasLarge = numbers.any((n) => n > 8);
  print(hasLarge);  // true

  var allPositive = numbers.every((n) => n > 0);
  print(allPositive);  // true
}

7. 异常处理

Dart 使用 try-catch 来处理异常。

异常处理示例

void main() {
  try {
    int result = divide(10, 0);
    print(result);
  } on IntegerDivisionByZeroException {
    print('Cannot divide by zero!');
  } catch (e, stackTrace) {
    print('Error: $e');
    print('Stack trace: $stackTrace');
  } finally {
    print('This always executes');
  }
}

int divide(int a, int b) {
  if (b == 0) {
    throw IntegerDivisionByZeroException();
  }
  return a ~/ b;
}
注意:在 Flutter 开发中,异步错误通常通过 Future 的 catchError 方法处理,而不是使用传统的 try-catch。

8. 扩展方法

Dart 2.7+ 支持扩展方法,可以为现有类型添加功能。

扩展示例

// 为 String 扩展方法
extension StringExtensions on String {
  bool get isEmail {
    return this.contains('@');
  }

  String capitalize() {
    return this[0].toUpperCase() + this.substring(1);
  }
}

void main() {
  String email = 'user@example.com';
  print(email.isEmail);  // true

  String name = 'dart';
  print(name.capitalize());  // Dart
}

9. 最佳实践

  • 使用 const 创建编译时常量
  • 优先使用类型推断(var)而非显式类型
  • 使用 final 声明不会改变的变量
  • 为函数添加返回类型注解
  • 使用命名参数提高代码可读性
  • 在异步操作中使用 try-catch 处理错误
下一步:掌握 Dart 基础后,继续学习 Flutter 项目结构和 Widget 基础。