Flutter Completer 的妙用
适用场景:
1.例如在app启动的时候,需要初始化数据(例如从服务端拉取数据),初始化的时间比较久,或者受限于网络,时间不可控,
后面用户点击了某个操作,这个操作依赖于初始化,就需要等待初始化完成,就可用使用Completer类来实现在这种效果。
2.将异步监听的方式,改成await的方式,更符合dart的使用方式。
Completer的方法就以下几个:
1 2 3 4 | completer.future; completer.isCompleted; completer.complete(); completer.completeError(error); |
针对场景1:
一般用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import 'dart:async' ; void main() { init(); // 例如用户点击触发的时候,执行doSomething方法, // doSomething方法内部需要等待init方法执行完成才可用继续完成用户的操作。 doSomething(); } Completer< void > completer = Completer< void >(); Future< void > init() async { print( "正在执行初始化的操作" ); await Future.delayed( const Duration(seconds: 2 )); completer.complete(); print( "初始化完成" ); } Future< void > doSomething() async { print( "执行其他操作" ); await completer.future; print( "执行其他操作完成" ); } |
执行结果:
1 2 3 4 5 | 正在执行初始化的操作 执行其他操作 // 等待2秒后 初始化完成 执行其他操作完成 |
也可抛出异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import 'dart:async' ; void main() { init(); // 例如用户点击触发的时候,执行doSomething方法, // doSomething方法内部需要等待init方法执行完成才可用继续完成用户的操作。 doSomething(); } Completer< void > completer = Completer< void >(); Future< void > init() async { print( "正在执行初始化的操作" ); await Future.delayed( const Duration(seconds: 2 )); // completer.complete(); completer.completeError( "初始化失败" ); print( "初始化完成" ); } Future< void > doSomething() async { print( "执行其他操作" ); try { await completer.future; } catch (e) { print(e); } print( "执行其他操作完成" ); } |
执行结果:
1 2 3 4 5 | 正在执行初始化的操作 执行其他操作<br> // 等待2秒 初始化完成 初始化失败 执行其他操作完成 |
针对适用场景2的demo:
import 'dart:async'; void main() { doSomething(); } typedef OnSuccess<T> = void Function(T response); typedef OnFailed = void Function(int errCode, String errMsg); Future<void> doSomething() async { Completer<String> completer = Completer<String>(); // 例如网络请求异步,或者是其他使用监听器来实现异步的,都可用改成async的方式 requestSomething( (response) => {completer.complete(response)}, (errCode, errMsg) => { completer.completeError({"errCode": errCode, "errMsg": errMsg}) }, ); try { String response = await completer.future; // 成功 print("执行响应:$response"); } catch (e) { print(e); } } void requestSomething(OnSuccess<String> onSuccess, OnFailed onFailed) { // Future.delayed(const Duration(seconds: 2)) // .then((value) => {onSuccess("执行成功")}); Future.delayed(const Duration(seconds: 2)) .then((value) => {onFailed(90001, "执行失败")}); }
分类:
Flutter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端