Flutter&Dart零基础入门教程(一)
Flutter 零基础入门(二):Dart 字符串与字符串插值
Flutter 零基础入门(三):条件判断与逻辑运算
Flutter零基础入门(四):switch、多分支判断与循环
Flutter零基础入门(五):List列表与遍历
Flutter 零基础入门(六):Map 键值对与简单数据模型
Flutter 零基础入门(七):函数(Function)与代码封装
Flutter 零基础入门(八):Dart 类(Class)与对象(Object)
Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
在上一篇中,我们已经学会了:
- 使用
class定义一个类 - 使用构造函数创建对象
- 使用对象访问属性和方法
例如:
dart
User user = User('Tom', 18);
你可能会有这些疑问:
- 构造函数到底是什么?
- 为什么函数名和类名一样?
this.name中的this到底指什么?- 一个类能不能有多个构造方式?
这一篇,我们就把这些问题一次性讲清楚。
一、什么是构造函数?
构造函数的作用只有一个:
在创建对象时,初始化对象的数据
当你写下这行代码:
User('Tom', 18);
实际上发生了两件事:
- 创建一个
User对象 - 给这个对象的属性赋初始值
这个过程,就是由 构造函数 完成的。
二、最基础的构造函数
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 与不可变数据》
下一篇我们将学习:
final和const的区别- 编译时常量 vs 运行时常量
- 为什么 Flutter 强烈推荐使用
const - 写出更高性能、更安全的代码
这是一个:
从"能用"走向"写得好"的关键主题