Menu
CoddyTech

回顾:数据获取器

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 81 课,共 110 课。

challenge icon

挑战

简单

让我们构建一个 DataFetcher 类,把本章介绍的所有异步面向对象编程概念结合起来!你将创建一个数据服务,使用异步初始化、用于获取单个项目的异步方法,以及用于随时间传递多个结果的流。

你将把代码分成两个文件:

  • data_fetcher.dart:创建一个 DataFetcher 类,模拟从远程数据源获取数据。这个类应包含:
    • 一个名为 source 的 final String 字段,用于保存数据来源
    • 一个用于初始化数据来源的私有构造函数
    • 一个静态异步工厂方法 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 在线编译器