Future和Completer的区别
Future
Future表示一个可能在将来某个时间点完成的计算或操作。它可以成功完成并返回一个值,或者以错误完成并抛出异常。Future通常用于异步操作,比如网络请求、文件读写等。
Future<String> fetchUserOrder() {
  return Future.delayed(Duration(seconds: 2), () => 'Large Latte');
}
void main() {
  print('Fetching user order...');
  fetchUserOrder().then((order) {
    print('Order: $order');
  });
}
fetchUserOrder返回一个Future,该Future在2秒后完成,并返回字符串'Large Latte'
- 通常通过内置方法或异步函数自动创建和返回。
- 完成状态由系统自动控制,例如网络请求完成后自动返回结果。
- 适用于简单的异步操作,结果由系统或异步函数自动处理。
Completer
类似new Promise通过resolve回调来终止该异步状态
Completer是一个用于手动控制Future完成状态的工具。通过Completer,可以创建一个Future并在需要的时候将其标记为完成(如需要等待用户授权结果的场景)
import 'dart:async';
Future<String> fetchUserOrder() {
  Completer<String> completer = Completer<String>();
  // 模拟一个异步操作
  Future.delayed(Duration(seconds: 2), () {
    completer.complete('Large Latte');
  });
  return completer.future;
}
void main() {
  print('Fetching user order...');
  fetchUserOrder().then((order) {
    print('Order: $order');
  });
}
- 手动创建,主要用于需要手动控制Future完成状态的场景。
- 开发者手动控制完成状态,调用complete或completeError方法。
- 适用于复杂的异步操作,特别是需要手动控制Future完成的场景,例如并发操作的协调。