面试题答案
一键面试Future的组合
- 策略:
- Future.then:当一个请求依赖另一个请求的结果时,可以使用
Future.then
方法。例如,如果有请求future1
和依赖future1
结果的请求future2
,可以这样写:
future1.then((result1) { return future2(result1); }).then((result2) { // 处理result2 });
- Future.wait:当多个请求相互独立,但需要等待所有请求完成后再进行下一步操作时,使用
Future.wait
。假设存在futureA
、futureB
和futureC
三个独立请求:
Future.wait([futureA, futureB, futureC]).then((results) { var resultA = results[0]; var resultB = results[1]; var resultC = results[2]; // 处理结果 });
- Future.then:当一个请求依赖另一个请求的结果时,可以使用
- 优势:
- Future.then:清晰地表达了请求之间的依赖关系,代码逻辑直观,易于理解和维护。适用于顺序执行且依赖关系明确的请求场景。
- Future.wait:可以并行执行多个独立请求,减少整体等待时间,提高效率。适用于需要等待多个独立请求全部完成后再进行统一处理的场景。
- 适用场景:
- Future.then:比如在获取用户信息后,根据用户信息获取该用户的特定订单列表,订单请求依赖用户信息请求的结果。
- Future.wait:同时获取用户的基本信息、设置信息和最近的通知列表,这些请求相互独立。
Stream的使用
- 策略:
- 使用
StreamController
创建一个流,在网络请求过程中通过add
方法将请求结果逐步添加到流中。例如:
final streamController = StreamController(); // 网络请求 Future.delayed(Duration(seconds: 1), () { streamController.add('请求结果1'); }); Future.delayed(Duration(seconds: 2), () { streamController.add('请求结果2'); }); streamController.stream.listen((data) { // 处理数据 });
- 对于依赖关系的请求,可以在
listen
回调中根据前一个请求结果触发下一个请求,并将结果继续通过流传递。
- 使用
- 优势:
- 可以处理连续的、异步产生的数据序列,适合处理需要实时更新或不断产生数据的网络请求场景。对于依赖关系的请求,在流的监听回调中处理依赖逻辑,使得代码结构相对灵活。
- 可以通过流的操作符(如
map
、filter
等)对流中的数据进行处理和转换,提高代码的可读性和复用性。
- 适用场景:
- 实时获取服务器推送的消息,如聊天消息、实时通知等,这些数据不断产生,适合用流来处理。
- 在一些需要根据前一个请求结果多次触发后续请求并处理结果的场景中,流也能较好地组织代码逻辑。