范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Flutter里的语法糖解析,知其所然方能潇洒舞剑

  作者:恋猫de小郭
  本篇主要针对 Flutter 里 Dart 的一些语法糖实现进行解析,让你明显简单声明的关键字背后, 「Dart 究竟做了什么?」
  如下图所示, 「起因是昨天在群里看到一个很基础的问题」 ,问: "这段代码为什么不能对 user 进行判空?"  。
  其实这个问题很简单:  1、在 Dart 的  「Sound Null Safety」  下声明了非空的对象是不需要判空;(你想判断也行,会有警告⚠️) 2、使用了  late  关键字声明的对象,如果在没有初始化的时候直接访问,就会报错;
  所以这个问题其实很简单,只需要改成  User? user  就可以简单解决,「但是为什么本来不可以为空的对象,加了 late 就可以不马上初始化呢?」  late
  首先如下图所示,我们写一段简单的代码,通过  late  声明了一个 playerAnimation  对象,然后在运行代码之后,通过 dump_kernel.dart  对编译后的 app.dill  进行提取。
  如下图所示,通过提取编译后的代码, 「可以看到 playerAnimation 其实被转变成了 Animation? 的可空对象」 ,而当 playerAnimation  被调用时,通过 get playerAnimation()  进行判断,如果此时 playerAnimation == null  , 直接就抛出 LateError  错误。
  「所以当我们访问 late 声明的对象时,如果对象还没有初始化,就会返回一个异常。」
  typedef
  介绍完  late  接下介绍下 typedef , typedef  在 Dart 2.13 开始可以用于「新的类型别名功能」 ,比如: // Type alias for functions (existing) typedef ValueChanged = void Function(T value);  // Type alias for classes (new!) typedef StringList = List;  // Rename classes in a non-breaking way (new!) @Deprecated("Use NewClassName instead") typedef OldClassName = NewClassName;
  那么  typedef  是如何工作的?如下图所示,可以看到 _getDeviceInfo  方法在编译后,其实直接就被替换为 List  ,所以「实际上 StringList 是不参与到编译后的代码运行」 ,所以也不会对代码的运行效率有什么影响。
  再举个例子,如下图所示,可以看到通过  SelectItemChanged  声明的 selectItemChanged ,在编译后其实直接就是 final field (dynamic) →? void selectItemChanged;  。
  接着我们通过 Dart 的  tear-off  来看另外一个现象,如下图所示,可以看到我们从一个任意对象中 x 中提取了 toString 方法,通过闭包,就可以像调用常规实例一样调用 x 。
  ❝
  如果在一个对象上调用函数并省略了括号, Dart 称之为 "tear-off"  :一个和函数使用同样参数的闭包,当调用闭包的时候会执行其中的函数,比如:names.forEach(print);  等同于 names.forEach((name){print(name);});
  ❞
  那么编译后的  getToString  方法会是怎么样的?
  如下图所示,可以看到  getToString  方法在编译后成了一个 static  的静态方法,并且 ToStringFn  也没有实际参与运行,也是被替换成了对应的 ()-> core:String  。
  「所以对于编译后的代码,typedef 并不会对性能和运行结果产生影响。」  extension
  在 Dart 里,通过  extension  可以很便捷地为对象进行拓展,「那 extension 关键字是如何在原对象基础上实现拓展呢?」
  如下图所示,我们声明了一个  Cat  的枚举,并且对 Cat  进行了拓展,从而为枚举的每个值赋值,并且加了 talk  方法。
  如下图所示, 「编译后 Cat 里的枚举值对应变成了一个 static final 的固定地址」 ,并且 CatExtension  里的 talk  和 value  也被指向了新的位置。
  找到对应的实现处发现, 「CatExtension 里的 name 和 talk 都变了所在文件下的 static method」  ,并且 talk  方法是先定义了 method  实现,之后再通过 tearoff  的 get  实现去调用,「基本上所有在 extension 里定义的方法都会有对应的 method 和 tearoff。」
  如下图所示,在  Cat  的使用处,编译后可以看到 cat.talk()  其实就是执行了 main::CatExtension|talk  。
  async / await
  最后聊聊  async / await  ,我们都知道这是 Dart 里 Future  的语法糖,那这个语法糖在编译后是如何运行的呢?
  可以看到, loadmore  方法在编译后被添加了很多的代码,其中定义了一个 _Future async_future  并在最后返回,同时我们需要执行的代码被包装到 async_op  里去执行,而这里有一个很关键的地方就是,「async_op 对执行的内容进行了 try catch 的操作,并通过 _completeOnAsyncError 返回」 。
  「这也是为什么我们在外部对一个 Future 进行 try catch 不能捕获异常的原因」 ,所以如下图所示,对于 Future  需要通过 .onError((error, stackTrace) => null)  的方式来对异常进行捕获处理。
  明白了这些关键字背后的实现后,相信可以更好地帮助你在 Flutter 的日常开发中更优雅地组织你的代码,从而避免很多不必要的问题。
  「当然,如果用不上,拿去面试"装X"其实也挺不错的不是么?」  最后
  在这里就还分享一份由大佬亲自收录整理的Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
  这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。
  当然,你也可以拿去查漏补缺,提升自身的竞争力。
  真心希望可以帮助到大家,Android路漫漫,共勉!
  如果你有需要的话,只需私信我【进阶】即可获取

热水器一直插着费电,还是用时插着费电?热水器也算是家里的一件用电量很大的电器了,一般也得有个两三千瓦,这也就导致了人们对热水器如何省电的问题十分的关心有的朋友就问了热水器是一直插着费电,还是用时插上再打开费电呢?很多朋滴滴会不会倒下?如果倒下了,全国滴滴司机会失业吗?失业是不可能的,滴滴倒了会出现嘟嘟的。其实应该问滴滴倒了,谁会成为网约车老大,个人觉得高德如果把所有平台都整合成一个,打败滴滴指日可待你把滴滴想的太高了把,没有大而不能倒的企业,没联想的全球总部要迁出北京?网友议论纷纷,官方却不予置评联想这次可能要跑路了?最近有消息称联想正在密谋将总部迁出北京,有趣的是当外界质疑声铺天盖地的时候,联想对于消息的态度是不予置评,联想的这种态度在很多人眼中基本上等于默认了。司马南的忘记比特币预计未来几个月将有7种山寨币爆炸自10月中旬以来,加密货币市场一直处于风暴状态主要代币的比率在一个月内下降了744。数字资产的价值下跌可以看作是一个赚钱的机会,所以在接下来的几个月里,你应该关注七种山寨币的波动(vivo施玉坚从本原出发,打造无限可能的多元未来在12月16日,vivo于深圳正式召开了2021vivo开发者大会。会上,vivo向与会者分享了vivo的理念成绩产品技术以及服务方面的信息,而vivo高级副总裁施玉坚也在会上发表1200万IP67防水,现已跌至1019元,旧款二手iPhone沦为千元机千元机在市场中的存在感比较低,各大手机厂商们每年都会花重金宣传自家的高端旗舰,却很少会专门为千元机投放宣传,而且千元机的发布会也比较简单,甚至许多千元机都不举办发布会,直接就上架开AI制药公司德睿智药(MindRankAI)完成数千万美元的A轮融资自主研发AI药物发现平台,已与美迪西生物和德琪医药达成战略合作。作者Lucia编辑tuya出品财经涂鸦近日,AI制药初创公司德睿智药(MindRankAI)已完成数千万美元A轮融资枫叶教育亏损超31亿北京首批线上学科培训非营利牌照仍在民政审批中一周教育要闻实习记者陈振芳本周,教育机构方面,学而思转型的非营利机构未能通过审批。言论在社交媒体发酵,北京首批线上学科培训非营利牌照仍在民政审批中,尚未获得许可证早教第一股美吉姆重庆两加盟店陷华东师范大学实现光力学随机热机近日,华东师范大学精密光谱科学与技术国家重点实验室教授武海斌团队实现了微纳尺度光力振子的随机光力热机,利用强耦合条件下简正模式为热机的工作介质,实现了单缸随机热机,发现了关联对做功互联网大厂裁员,终于让我感受到内卷的严重最近的大厂裁员消息火爆了网络。爱奇艺最多一个部门裁员百分之四十,平均下来百分之二十左右。天天看的快手裁员百分之三十。腾讯,字节跳动,京东等也加入了裁员大军。然后,看到有的人因为裁员为什么有人不看好电动车很多人不看好电动车,主要是因为大家已经适应燃油车的方方面面了。就好比冰红茶出了个新口味,还是0糖0脂的,口味上也还是没有经典款那么容易被大家接受的。电动车使用条件对很多人并不友好首
基于SSMMySQL开发的人力资源管理系统科讯人力资源管理系统项目演示地址httpdemo。kexunsoftware。comlogin账号lidong密码123注若访问报错或者无法访问,可与我联系修复微信kexunsof苹果用户转华为P50,单纯想尝试一下鸿蒙系统,结果没有让我失望在苹果和华为之间徘徊不定,最后我决定买了华为P50,支持一下国产,虽然用了这么多年苹果手机,在使用上已经习惯iOS了,但是就是想尝试一下鸿蒙系统。首先外观方面,万象双环设计令人惊艳右耳听力正常,但左耳听力是重度听力损失的情况下不配助听器可以吗?你好!孩子右耳听力正常,但左耳听力是重度听力损失不配助听器行不行?您好,根据您说的情况,我觉得应该配助听器。如果不配可能会出现有以下问题1在孩子左耳方向的声音会听不清楚,然后他会一攀升diy主机怎么样?为什么价格比自己买配件的便宜?很高兴能回答你的问题,个人观点!希望能帮到你。销量大了可以定制阉割版,价格肯定就下来了,赚的也是辛苦钱便宜的原因一般是因为拿货价便宜。第二个就是配件缩水。同型号不同品牌,一台主机下各大软件推出IP属地显示,意义何在?IP属地就是IP所在归属地的简称,透过此功能,能看到用户发帖投博评论发视频所在的大致地点,是在国内还是在国外,是国内某个省市区还是国外的某个地方,都会有比较清晰的显现,其他人也会根如何做好外贸?首先感谢提问,根据多年经验,总结以下几点第一,首先产品的选择,就是确定卖什么产品,找什么样的供应商,如果自己有工厂,那就在自己现有产品下功夫,没有工厂,就要自己开发适合自己工厂来配为什么感觉越来越多的人宁愿购买落后的机顶盒,也不愿更换智能电视?再智能的电视也会落后,再落后的机顶盒也能换新。有脑就有常识,换电视不如换机顶盒方便抠鼻这类人主要是老年人,尤其是没有文化或文化低下的老年人宁愿购买落后的机顶盒收看电视节目。还有一个吴雄昂能否翻盘?从法律视角看安谋科技控制权之争2022年4月28日1324,微信公众号爱集微上发布了题为独家软银对中国半导体野心暴露试图重新控制安谋科技的文章。2022年4月29日1804,微信公众号爱集微再次发布了题为拒绝被商业贸易的分水岭马云今天的支付宝和淘宝几乎成了每个人的生活必备应用。买东西再也不必亲往店铺,网购即可。做到这些的,就是马云。他改变了传统的购物和交易方式,影响了人们生活方式。网上购物,对实体店铺确实形推荐这款类型转换神器!Mapstruct新出的Spring插件Mapstruct可以代替BeanUtil来进行DTOVOPO之间的转换。它使用的是Java编译期的annotationprocessor机制,说白了它就是一个代码生成器,代替你手二富士X系列相机推荐!这10款值得购买二富士X系列相机富士胶片秉承相机是用来拍摄作品的工具这一概念,不断地研发摄影师喜爱的相机。为了能够随时随地进行摄影,及时捕捉决定性瞬间的出彩照片,富士胶片立足于相机该有的样子,通过