MST

星途 面试题库

面试题:Flutter异步编程中如何优化复杂的异步任务依赖关系

在一个复杂的Flutter项目中,存在多个异步任务,这些任务之间存在着复杂的依赖关系,例如任务A完成后,任务B和任务C并行执行,任务B和任务C都完成后,任务D才能执行。请描述如何使用Flutter的异步编程特性(如Future、Stream等)来优化这种复杂的异步任务依赖关系,以提高程序的性能和可维护性,同时给出详细的代码实现方案。
18.9万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试
  1. 使用Future优化异步任务依赖关系
    • 思路:利用Futurethen方法和Future.wait方法来处理任务的先后顺序和并行执行。then方法用于在一个Future完成后执行下一个任务,Future.wait方法用于等待多个Future都完成。
    • 代码实现
import 'dart:async';

Future<void> taskA() async {
  // 模拟任务A的异步操作,例如网络请求或数据库查询
  await Future.delayed(const Duration(seconds: 2), () => print('Task A completed'));
}

Future<void> taskB() async {
  await Future.delayed(const Duration(seconds: 1), () => print('Task B completed'));
}

Future<void> taskC() async {
  await Future.delayed(const Duration(seconds: 1), () => print('Task C completed'));
}

Future<void> taskD() async {
  await Future.delayed(const Duration(seconds: 1), () => print('Task D completed'));
}

void main() async {
  // 执行任务A
  await taskA();
  // 任务B和任务C并行执行
  List<Future<void>> tasksBC = [taskB(), taskC()];
  await Future.wait(tasksBC);
  // 任务B和任务C都完成后执行任务D
  await taskD();
}
  1. 使用Stream的情况(相对复杂但在某些场景更合适,如持续监听任务状态变化)
    • 思路:通过StreamController创建Stream,在任务完成时向Stream中添加数据,通过StreamSubscription监听Stream来触发后续任务。
    • 代码实现
import 'dart:async';

StreamController<int> streamControllerA = StreamController<int>();
StreamController<int> streamControllerB = StreamController<int>();
StreamController<int> streamControllerC = StreamController<int>();
StreamController<int> streamControllerD = StreamController<int>();

Future<void> taskA() async {
  await Future.delayed(const Duration(seconds: 2), () {
    print('Task A completed');
    streamControllerA.add(1);
  });
}

Future<void> taskB() async {
  await streamControllerA.stream.first;
  await Future.delayed(const Duration(seconds: 1), () {
    print('Task B completed');
    streamControllerB.add(1);
  });
}

Future<void> taskC() async {
  await streamControllerA.stream.first;
  await Future.delayed(const Duration(seconds: 1), () {
    print('Task C completed');
    streamControllerC.add(1);
  });
}

Future<void> taskD() async {
  await Future.wait([streamControllerB.stream.first, streamControllerC.stream.first]);
  await Future.delayed(const Duration(seconds: 1), () {
    print('Task D completed');
    streamControllerD.add(1);
  });
}

void main() async {
  // 启动任务A
  taskA();
  // 启动任务B和任务C
  taskB();
  taskC();
  // 启动任务D
  taskD();
  // 关闭所有StreamController
  streamControllerA.close();
  streamControllerB.close();
  streamControllerC.close();
  streamControllerD.close();
}

在实际复杂项目中,Future方式通常更简洁且易于理解和维护,而Stream方式更适合需要持续监听任务状态变化或有更复杂事件驱动需求的场景。