学习内容:
Dart 类(
class/构造函数/继承)异步编程(
Future/async/await,解决网络请求延迟问题)实践任务:
定义一个「Person 类」,包含姓名、年龄,写一个方法打印个人信息
写一个异步函数:模拟 2 秒后返回 “请求成功”,并用
async-await调用
一、Dart类※
1. 类的定义与实例化※
核心知识点
类的基本结构(属性、方法)
实例化对象(new关键字可省略)
属性的访问与修改(默认公开,可通过_定义私有属性)
class Student
{
// 公开属性(这里暂时写成?的形式,因为不做默认值设置且这里未使用构造函数,不能为null)
String? name;
int? age;
// 私有属性
int _score = 0;
void study()
{
print('$name在学习');
}
int getScore()
{
return _score;
}
}
void main()
{
// 实例化对象
var student = Student();
student.name = '张三';
student.age = 18;
student._score = 100; // 私有属性只能在当前文件访问
student.study();
print('成绩:${student.getScore()}');
}2. 构造函数※
- 核心知识点
- 默认构造函数
- 自定义构造函数(带参数)
- 命名构造函数(多构造场景)
- 构造函数参数初始化(this.属性 简化赋值)
class Student
{
String name;
int age;
int _score;
// 自定义构造函数(带参数)
Student(this.name, this.age, this._score);
// 命名构造函数(使用场景:创建默认分数的学生)
Student.defaultScore(this.name, this.age) : _score = 60;
void study()
{
print('$name($age岁)在学习,成绩:$_score');
}
}
void main()
{
var student = Student('张三', 18, 100);
student.study();
var student1 = Student.defaultScore('李四', 20);
student1.study();
}3. 继承和多态※
核心知识点
继承关键字extends(单继承)
重写父类方法(@override)
调用父类构造函数(super())
多态:子类对象赋值给父类引用,调用重写方法
class Person
{
String name;
int age;
Person(this.name, this.age);
void introduce()
{
print('我是$name,今年$age岁');
}
}
class Student extends Person
{
int _score;
// 子类构造函数:必须调用父类构造函数(super)
Student(String name, int age, this._score) : super(name, age);
// 重写父类方法
@override
void introduce()
{
super.introduce();
print('我是学生,成绩:$_score');
}
// 子类特有方法
void study()
{
print('$name在学习');
}
}
void main()
{
// 多态:子类对象赋值给父类引用
Person person = Student('张三', 18, 100);
person.introduce();
// 强制类型转换后调用子类方法
if (person is Student)
{
person.study();
}
}二、异步编程※
1. 同步与异步的区别※
- 核心概念
- 同步:代码按顺序执行,上一行执行完成才执行下一行(阻塞)
- 异步:代码不阻塞,上一行未执行完时可执行下一行(如:网络请求,文件读写)
2. Future基础※
- 核心知识点
- Future表示“未来的结果”,用于包装异步操作
- 状态:未完成(pending)→ 完成(success/error)
- 回调方法:then()(成功回调)、catchError()(失败回调)、whenComplete()(无论成功与失败都执行)
- 模拟异步任务
// 模拟异步网络请求(延迟2秒返回数据)
Future<String> fetchData()
{
return Future.delayed(Duration(seconds: 2), ()
{
// 模拟请求成功
return '获取到学习数据:Dart类与异步编程';
});
}
void main()
{
print('开始请求数据...');
// 调用异步方法
fetchData()
.then((data)
{
// 成功回调
print('请求成功:$data');
})
.catchError((error)
{
// 失败回调
print('请求失败:$error');
})
.whenComplete(()
{
// 无论成功与失败都执行
print('请求数据完成.');
});
print('继续执行其他任务...'); // 这里不会被前面的fetchData阻塞,会先执行
}3. async/await 简化异步代码※
- 核心知识点
- async:修饰函数,表名函数是异步的,返回Future
- await:只能在async函数内使用,等待Future完成(阻塞当前函数,不阻塞整个程序)
- 错误处理:tyr-catch捕获异步错误(比catchError更直观)
- 重写第2点的异步任务
// 模拟异步网络请求(延迟2秒返回数据)
Future<String> fetchData()
{
return Future.delayed(Duration(seconds: 2), ()
{
// 模拟请求成功
// return '获取到学习数据:Dart类与异步编程';
throw Exception('网络错误');
});
}
// 异步函数(async修饰)
Future<void> loadData() async
{
print('开始请求数据...');
try
{
// await等待异步结果
String data = await fetchData();
print('请求成功:$data');
}
catch (error)
{
// 捕获异步错误
print('请求失败:$error');
}
finally
{
// 无论成功与失败都执行
print('请求数据完成.');
}
}
void main()
{
loadData();
print('继续执行其他任务...'); // 这里不会被前面的fetchData阻塞,会先执行
}4. 并行异步任务※
- 核心知识点
- Future.wait():等待多个异步任务同时完成(并行执行,提升效率)
- 使用场景:多个独立的异步任务(如:同时请求多个接口)
- 模拟多个并行异步任务
// 模拟请求用户信息
Future<String> fetchUser() => Future.delayed(Duration(seconds: 1), () => '小明');
// 模拟请求课程
Future<String> fetchCourse() => Future.delayed(Duration(seconds: 3), () => '网络安全');
// 模拟请求成绩
Future<int> fetchScore() => Future.delayed(Duration(seconds: 2), () => 100);
Future<void> loadAllData() async {
print('开始并行请求...');
// 并行执行多个异步任务
List<dynamic> results = await Future.wait([
fetchUser(),
fetchCourse(),
fetchScore()
]);
// 结果顺序和传入的任务顺序一致
print('用户名:${results[0]}, 课程:${results[1]}, 成绩:${results[2]}');
}
void main()
{
loadAllData();
}