回顾:数据获取器
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 81 课,共 110 课。
挑战
简单让我们构建一个 DataFetcher 类,把本章介绍的所有异步面向对象编程概念结合起来!你将创建一个数据服务,使用异步初始化、用于获取单个项目的异步方法,以及用于随时间传递多个结果的流。
你将把代码分成两个文件:
data_fetcher.dart:创建一个DataFetcher类,模拟从远程数据源获取数据。这个类应包含:- 一个名为
source的 finalString字段,用于保存数据来源 - 一个用于初始化数据来源的私有构造函数
- 一个静态异步工厂方法
connect(String sourceName),返回Future<DataFetcher>。模拟 100 毫秒的连接延迟,然后返回一个数据来源设为所提供名称的新实例 - 一个异步方法
fetchItem(int id),返回Future<String>。模拟 50 毫秒的延迟,然后返回格式为[source]-Item-[id]的字符串 - 一个流生成器方法
fetchMultiple(int count),返回Stream<String>。它应生成 ID 从 1 到count(包括count)的项目,并对每个项目调用fetchItem方法(每次获取完成后再生成项目)
- 一个名为
main.dart:导入你的数据获取器,并演示三种异步模式如何协同工作:- 打印
Connecting to data source... - 使用异步工厂连接到名为
CloudDB的数据源 - 使用获取器的 source 字段打印
Connected to [source] - 打印一个空行
- 打印
Fetching single item: - 获取并打印 ID 为
42的项目 - 打印一个空行
- 打印
Fetching multiple items: - 使用
await for遍历fetchMultiple(3),并打印每个项目 - 打印一个空行
- 打印
All operations complete!
- 打印
这个挑战结合了用于初始化的静态异步工厂模式、用于单次操作的常规异步方法,以及用于流式传递多个结果的 async* 和 yield。注意,流方法可以在内部调用其他异步方法!
预期输出:
Connecting to data source...
Connected to CloudDB
Fetching single item:
CloudDB-Item-42
Fetching multiple items:
CloudDB-Item-1
CloudDB-Item-2
CloudDB-Item-3
All operations complete!亲手试试
import 'data_fetcher.dart';
void main() async {
// TODO: 打印 'Connecting to data source...'
// TODO: 使用异步工厂连接到名为 'CloudDB' 的数据源
// TODO: 使用 fetcher 的 source 字段打印 'Connected to [source]'
// TODO: 打印一个空行
// TODO: 打印 'Fetching single item:'
// TODO: 获取并打印 ID 为 42 的条目
// TODO: 打印一个空行
// TODO: 打印 'Fetching multiple items:'
// TODO: 使用 'await for' 遍历 fetchMultiple(3),并打印每个条目
// TODO: 打印一个空行
// TODO: 打印 'All operations complete!'
}
面向对象编程中的所有课
自己练习: Dart 在线编译器