当前位置: 首页 > news >正文

【Flutter】Flutter 异步方法调用 ( async 和 await 关键字解析 | Dart 单线程 | await 调用方式对比 | Future<void> 返回值作用 )

文章目录

  • 一、错误记录
  • 二、原理分析
    • 1、报错分析
    • 2、async 和 await 关键字解析
    • 3、Dart 单线程
    • 4、await 调用方式对比
      • 使用 await 关键字调用
      • 不使用 await 关键字调用
    • 5、Future\<void> 返回值作用
  • 三、解决方案
    • 1、方案 1 : 方法加上 async
    • 2、方案 2 : 调用去掉 await




一、错误记录



编译 Flutter 应用时 , 报如下错误 :

D:\002_Project\001_Flutter\client_terminal>flutter build apk--debugFlutterassets will be downloaded from https://storage.flutter-io.cn.Makesure you trustthissource!Flutterassets will be downloaded from https://storage.flutter-io.cn.Makesure you trustthissource!lib/pages/login_page.dart:38:5:Error:'await'can only be usedin'async'or'async*'methods.awaitLoginController().login(context,_accountController.text,_passwordController.text);// 调用登录方法 , 传入账号和密码^^^^^Targetkernel_snapshot_program failed:ExceptionFAILURE:Buildfailedwithan exception.*Whatwent wrong:Executionfailedfortask':app:compileFlutterBuildDebug'.>Process'command 'D:\001_Develop\026_Flutter_3.41.7\flutter\bin\flutter.bat''finishedwithnon-zero exit value1*Try:>Runwith--stacktrace option togetthe stack trace.>Runwith--info or--debug option togetmore log output.>Runwith--scan togetfull insights.>Getmore help at https://help.gradle.org.BUILD FAILEDin10sRunningGradletask'assembleDebug'...10.7sGradletask assembleDebug failedwithexit code1D:\002_Project\001_Flutter\client_terminal>





二、原理分析




1、报错分析


报错问题 :

Error:'await'can only be usedin'async'or'async*'methods.

报错原因是在一个「普通方法 / 按钮点击」里写了 await ,但这个方法没有加 async 关键字 ;


await 必须配合 async 一起用, 否则 Dart 直接报错 ;

  • async 是" 声明这是一个异步方法 " ;
  • await 是" 等待这个异步任务执行完 " ;
  • await只能在 async 方法里用 , 否则报错 ;

2、async 和 await 关键字解析


Dart 是单线程语言 , 不能真正阻塞 , 所以用 异步 + 事件循环 实现不卡顿 ;

  • async 关键字 :把方法包装成异步任务 ;
  • await 关键字 :暂停当前方法 , 不阻塞主线程 , 等任务完成后再恢复执行 ;

表面看像同步代码 , 底层实际是异步非阻塞执行 ;


async 关键字 作用 :告诉 Dart 这个方法里面有异步操作 , 不能立刻执行完 ;

  • 加了 async , 方法就变成异步方法
  • 异步方法自动返回 Future
  • 只有加了它 , 里面才能写 await

await 关键字 作用 :等待后面的异步任务执行完成 , 再继续往下走 ;

  • 等待网络请求
  • 等待文件读写
  • 等待数据库操作
  • 等待延时

3、Dart 单线程


Dart 永远是单线程 , 不会卡住 , 但它有一个机制 :

  • 遇到耗时操作 ( await ) , 就先挂起 , 去干别的事
  • 耗时操作做完 , 再回来继续执行
  • 它不会阻塞线程 , 但可以 " 等待任务结果 " ;

两个写法都是单线程 , 但执行结果完全不一样 ;

  • await doSomething();会等待 , 等里面的异步任务 ( 网络请求 / 延时 ) 真正做完 , 才继续往下走 ;
  • doSomething();不会等待 , 直接立刻往下执行 , 异步任务在后台自己慢慢跑 ;

4、await 调用方式对比


调用下面的方法 :

Future<void>doSomething()async{awaitFuture.delayed(Duration(seconds:2));// 模拟耗时2秒print("任务完成");}

使用 await 关键字调用

使用

print("开始");awaitdoSomething();// 等待2秒print("结束");

方式 , 进行调用 , 得到的结果 :

开始(等待2)任务完成 结束

不使用 await 关键字调用

使用

print("开始");doSomething();// 不等待 , 直接跳过print("结束");

方式执行 , 结果

开始 结束(2秒后)任务完成

5、Future<void> 返回值作用


Future<void> 这个返回值的真正作用=让外部能「等待」这个方法执行完 ;

  • 没有它 , 你就不能用 await ;
  • 不能用 await , 你就无法控制执行顺序 ;

Future<void>不是 " 返回内容 " ,而是一个「任务凭证 / 任务小票」 ;

  • void = 没有实际数据返回 ( 不 return 任何值 ) ;
  • Future = 代表一个异步任务 , 可以被等待 ;

await 只能等待 Future 返回值类型的函数 :

  • 你给它 void → 它不认识 , 无法等待 ;
  • 你给它 Future → 它认识 , 可以等待 ;




三、解决方案




1、方案 1 : 方法加上 async


方案 1 : 给方法加上 async ( 最常用、最标准 )

Future<void>_handleLogin()async{awaitLoginController().login(username,password);}

2、方案 2 : 调用去掉 await


方案 2 : 如果不需要等待 , 直接去掉 await ;

void_handleLogin(){LoginController().login(username,password);}
http://www.jsqmd.com/news/943539/

相关文章:

  • 终极免费甘特图工具:GanttProject 让你轻松管理复杂项目
  • OpenRocket模型火箭设计软件:从零开始掌握火箭仿真与优化
  • 火灾事故动画还原需要注意哪些细节?
  • 保姆级教程:在Ubuntu 20.04上用Docker容器搞定PX4开发环境(附Java报错解决)
  • 微信收藏的图片到底存了几份?我用Python脚本帮你理清了Data、Temp、Thumb三大文件夹的关系
  • 2026年6月全国百达翡丽官方维修服务网点汇总,门店地址及售后电话一览 - 资讯快报
  • 免费开源图片去重神器:3步告别重复照片困扰的终极解决方案
  • CPT Markets:多维度评估平台运营与服务细节
  • 计算机毕业设计之基于flask框架的微博实时热点数据可视化设计与实现
  • 基于LM317的DIY可调稳压电源制作全攻略:从原理到实践
  • 基于ESP32-CAM的3D打印机无线监控方案:从硬件选型到软件集成
  • 2026年 磁铁全品类推荐榜单:钕铁硼/异形/方形/圆形/电机磁铁及锂电磁棒/磁组件源头厂家实力解析! - 品牌企业推荐师(官方)
  • 产品寿命预测实战:手把手用Python+Weibull模型评估5000次循环后的可靠性(附双侧/单侧置信区间代码)
  • 2026年6月昭通贵金属回收权威门店排行 TOP5 黄金 + 铂金 + 白银回收 附电话地址 - 中业金奢再生回收中心
  • C#零基础通关第十五篇:吃透特性Attribute与AOP编程,实现数据校验、权限拦截、架构解耦
  • TestDisk与PhotoRec:免费开源数据恢复双雄的完整使用指南
  • 不止于杀毒:火绒安全这些隐藏功能,才是电脑高手的秘密武器
  • 跨平台无障碍设计实践:从Web、VR到教室的包容性交互框架
  • Java流程控制语句详解
  • 告别手动标注!用SAM(Segment Anything)自动生成COCO格式数据集,实测避坑指南
  • 2026巴中市本地黄金回收铂金白银回收哪家强?TOP5 正规门店榜单 + 联系方式 - 中安检金银铂钻回收
  • 荆门市地区2026年权威甄选:黄金回收白银铂金回收优质门店 TOP5 含详细电话 - 诚金汇钻回收公司
  • 想选国内余热锅炉销售厂家?这几家值得你重点关注!
  • ‘三区三线’永农图斑编号避坑指南:ArcGIS三种方法实测,哪种最快最合规?
  • ThinkPad风扇控制终极指南:TPFanCtrl2双风扇管理工具详解
  • 你的AI工具还在“手动续订”?3个信号表明智能订阅整合已刻不容缓(附ROI测算Excel自动模型)
  • 基于ESP32与MicroPython的离线小恐龙游戏机开发全解析
  • 深度解析:SUSFS4KSU-Module内核级Root隐藏的3大核心技术
  • 一键备份QQ空间历史说说:GetQzonehistory完整使用指南
  • CISA KEV紧急收录Oracle WebLogic漏洞 + Android一次性修复124个漏洞:中间件与移动端攻击链完整复盘