Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字

21 阅读3分钟

Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字

公众号版

在上一篇中,我们已经学会了:

  • 使用 class 定义一个类
  • 使用构造函数创建对象
  • 使用对象访问属性和方法

例如:

User user = User('Tom', 18);

你可能会有这些疑问:

  • 构造函数到底是什么?
  • 为什么函数名和类名一样?
  • this.name 中的 this 到底指什么?
  • 一个类能不能有多个构造方式?

这一篇,我们就把这些问题一次性讲清楚


一、什么是构造函数?

构造函数的作用只有一个:

在创建对象时,初始化对象的数据

当你写下这行代码:

User('Tom', 18);

实际上发生了两件事:

  1. 创建一个 User 对象
  2. 给这个对象的属性赋初始值

这个过程,就是由 构造函数 完成的。


二、最基础的构造函数

class User {
  String name;
  int age;

  User(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

理解重点:

  • 构造函数 名字必须和类名一样
  • 没有返回值
  • 在对象创建时自动执行

三、this 关键字到底是什么?

在上面的代码中:

this.name = name;

这里出现了两个 name,它们并不一样:

  • 左边的 name对象自己的属性
  • 右边的 name构造函数的参数

📌 this 表示:

当前正在创建的这个对象

换句话说:

this.name

等价于:

“这个对象的 name 属性”


四、为什么要使用 this?

如果不使用 this,代码会变得不清晰甚至错误。

name = name; // ❌ 无意义,自己给自己赋值

所以当:

  • 属性名
  • 参数名

相同时,就必须使用 this 来区分。


五、构造函数的简写形式(推荐)

Dart 提供了一种非常常用、非常优雅的写法:

class User {
  String name;
  int age;

  User(this.name, this.age);
}

这行代码等价于:

User(String name, int age) {
  this.name = name;
  this.age = age;
}

📌 在 Flutter 项目中,90% 的构造函数都长这样


六、命名构造函数(Named Constructor)

有时候,一个类需要多种创建方式

例如:

  • 从默认数据创建
  • 从接口数据创建
  • 创建一个“空对象”

这时就需要 命名构造函数


1️⃣ 命名构造函数的定义方式

class User {
  String name;
  int age;

  User(this.name, this.age);

  User.guest() {
    name = 'Guest';
    age = 0;
  }
}

2️⃣ 使用命名构造函数

User user1 = User('Tom', 18);
User user2 = User.guest();

📌 特点:

  • 类名 + . + 构造函数名
  • 表达语义非常清晰

七、命名构造函数的常见用途

示例:从 Map 创建对象(非常重要)

class User {
  String name;
  int age;

  User(this.name, this.age);

  User.fromMap(Map<String, dynamic> map) {
    name = map['name'];
    age = map['age'];
  }
}

使用:

Map<String, dynamic> data = {
  'name': 'Lucy',
  'age': 20,
};

User user = User.fromMap(data);

📌 这是 后续 JSON / 接口数据解析的核心写法


八、构造函数在 Flutter 中的意义

在 Flutter 中:

  • 每一个 Widget 都有构造函数
  • 参数通过构造函数传入
  • this.xxx 是最常见写法

例如(概念层面):

MyWidget({this.title});

📌 你现在学的内容,会在 Flutter UI 中被大量使用。


九、一个综合示例

class Product {
  String name;
  int price;

  Product(this.name, this.price);

  Product.free() {
    name = 'Free Product';
    price = 0;
  }

  void showInfo() {
    print('$name 的价格是 ¥$price');
  }
}

使用:

Product p1 = Product('iPhone', 5999);
Product p2 = Product.free();

p1.showInfo();
p2.showInfo();

十、总结

本篇你已经学会了:

  • 构造函数的作用
  • this 关键字的真正含义
  • 构造函数的简写方式
  • 命名构造函数的使用场景

你已经正式掌握了:

Dart 面向对象编程的核心细节


🔜 下一篇预告

《Flutter 零基础入门(十):final、const 与不可变数据》

下一篇我们将学习:

  • finalconst 的区别
  • 编译时常量 vs 运行时常量
  • 为什么 Flutter 强烈推荐使用 const
  • 写出更高性能、更安全的代码

这是一个:

从“能用”走向“写得好”的关键主题