Dart 编程学习笔记

1. 变量与常量

Dart 使用 var 声明变量,constfinal 声明常量。

var age = 30;          // 变量
final name = "Alice";   // 常量,只读
const pi = 3.1415;      // 编译时常量

注意事项: const 用于编译时常量,final 用于运行时确定的常量。

2. 数据类型

Dart 是强类型语言,支持基本数据类型如 intdoubleStringbool

double height = 1.75;
bool isStudent = true;
String city = "New York";

易错点:确保使用正确的数据类型,避免隐式转换错误。

3. 条件控制

Dart 使用 ifelseswitch 实现条件控制。

if (age > 18) {
    print("Adult");
} else {
    print("Minor");
}

注意事项: switch 语句需包含 default 分支。

4. 函数

使用 void 或返回类型定义函数。

String greet(String name) {
    return "Hello, $name!";
}

易错点:函数的参数类型必须匹配传入的值类型。

5. 类与对象

Dart 支持面向对象编程,类的定义使用 class 关键字。

class Person {
    String name;
    int age;

    Person(this.name, this.age);

    void greet() {
        print("Hello, my name is $name");
    }
}

注意事项:构造函数可以使用 this 简写初始化字段。

6. 集合操作

Dart 提供了 ListSetMap 集合类型。

List names = ["Alice", "Bob"];
Set numbers = {1, 2, 3};
Map scores = {"Alice": 90, "Bob": 85};

易错点: ListSet 类型必须一致,Map 键值对类型必须一致。

7. 异步编程

Dart 使用 asyncawait 实现异步编程。

Future fetchData() async {
    var data = await fetchDataFromServer();
    print(data);
}

注意事项:异步函数返回 Future,调用时需使用 await

8. 错误处理

使用 trycatchfinally 处理错误。

try {
    int result = 10 ~/ 0;
} catch (e) {
    print("Error: $e");
} finally {
    print("Operation complete");
}

注意事项: ~/ 用于整除操作,防止小数结果。

高级与小众用法

扩展方法

Dart 允许通过扩展方法为现有类添加新方法。

extension NumberParsing on String {
    int toIntOrZero() {
        return int.tryParse(this) ?? 0;
    }
}

注意事项:扩展方法不影响原类定义,仅限于当前作用域使用。

箭头函数

箭头函数用于单行函数简写。

int add(int a, int b) => a + b;

易错点:箭头函数仅适用于单一表达式,不能包含多行代码。

构造函数重定向

构造函数重定向允许一个构造函数调用另一个构造函数。

class Point {
    int x, y;
    Point(this.x, this.y);
    Point.origin() : this(0, 0);  // 重定向到主构造函数
}

注意事项:重定向构造函数必须在初始化列表中使用。

级联操作符

级联操作符 .. 可以链式调用对象的多个方法。

var buffer = StringBuffer()
  ..write("Hello")
  ..write(" World");

注意事项:级联操作符适合链式调用,避免代码冗长。

Null 安全

Dart 使用 ??? 实现 Null 安全。

String? name;
print(name ?? "Unknown");  // 若 name 为 null,则输出 "Unknown"

易错点:使用 ! 断言非空时确保变量不为 null

泛型

泛型使代码更灵活,可以用于类和方法。

class Box {
    T content;
    Box(this.content);
}

注意事项:泛型的具体类型在使用时才会确定。