Flutter:同步多次调用异步函数时共享表单返回值的问题
解决方案:共享表单Future实现并行调用同步结果
要实现多个并行调用共享同一次表单操作的结果,核心思路是缓存当前正在进行的表单Future,让后续调用直接等待这个已存在的Future,而不是重复发起新的表单请求。
具体实现步骤:
- 定义缓存变量
在你的类中添加一个成员变量,用来保存当前正在进行的表单Future:
Future<dynamic>? _pendingFormFuture;
- 改造异步函数
修改弹出表单的异步函数,每次调用时先检查缓存是否存在,存在则复用,不存在则发起新请求并缓存:
Future<dynamic> showTheForm(BuildContext context) async { // 若已有弹出的表单,直接返回正在等待的Future if (_pendingFormFuture != null) { return _pendingFormFuture; } // 发起表单请求并缓存Future _pendingFormFuture = Navigator.push( context, MaterialPageRoute(builder: (context) => const TheForm()), ).whenComplete(() { // 表单操作完成后清空缓存,确保下次调用可重新弹出表单 _pendingFormFuture = null; }); return _pendingFormFuture; }
- 调用方式
现在即使你用Future.wait并行调用多次,所有调用都会共享同一次表单的结果:
List response = await Future.wait([ showTheForm(context), showTheForm(context) ]);
原理说明
Dart中的Future是一次性的异步任务载体,一旦完成就会返回固定结果。通过缓存正在进行的表单Future,后续调用无需重新发起Navigator请求,直接等待该Future完成即可,自然会拿到和第一个调用相同的返回值。whenComplete回调会在表单关闭(无论提交还是取消)后清空缓存,保证下次调用能正常弹出新表单。
内容的提问来源于stack exchange,提问作者stackunderflow
相关产品推荐
相关产品推荐

