介绍完 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) 的方式来对异常进行捕获处理。

图所示,对于 Future 需要通过 .onError((error, stackTrace) => null) 的方式来对异常进行捕获处理。

Flutter 里的语法糖解析,知其所然方能潇洒舞剑,安卓开发面试题及答案相关推荐

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

    本篇主要针对 Flutter 里 Dart 的一些语法糖实现进行解析,让你明显简单声明的关键字背后,Dart 究竟做了什么? 如下图所示,起因是昨天在群里看到一个很基础的问题,问: "这段代 ...

  2. Flutter 里的语法糖解析,知其所然方能潇洒舞剑 | 开发者说·DTalk

    本文原作者: 恋猫de小郭,原文发布于: GSYTech 本篇主要针对 Flutter 里 Dart 的一些语法糖实现进行解析,让您明白简单声明的关键字背后,Dart 究竟做了什么? 如下图所示,起因 ...

  3. Flutter 里的语法糖解析,知其所然方能潇洒舞剑,为什么阿里的程序员成长如此之快

    ================================================================ 首先如下图所示,我们写一段简单的代码,通过 late 声明了一个 pl ...

  4. Flutter 里的语法糖解析,知其所然方能潇洒舞剑,10天用Flutter撸了个高仿携程App

    如下图所示,「起因是昨天在群里看到一个很基础的问题」,问: "这段代码为什么不能对 user 进行判空?" . 其实这个问题很简单: 1.在 Dart 的 **「Sound Nul ...

  5. 优秀Android程序员必知必会的网络基础,Android开发面试题及答案

    前言 大家应该看过不少人分享的面试成功的面经,是不是觉得自己"说不定也可以"呢? 这里重提一个理论:幸存者偏差.当取得资讯的渠道,仅来自于幸存者时(因为死人不会说话),此资讯可能会 ...

  6. switch(String)语法糖解析

    switch(String)语法糖解析 Java1.5之前,switch语法结构仅支持int, byte, short, char这几个基本类型(及对应的包装类型). 1.5后提供了enum枚举结构. ...

  7. 列举Java高并发面试题附答案解析

    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答. Java并发面试题附答案 1. 什么是原子操作在J ...

  8. java高并发面试题目_列举Java高并发面试题附答案解析

    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答. Java并发面试题附答案 1. 什么是原子操作?在 ...

  9. java run里面定义变量_Java程序员50多道最热门的多线程和并发面试题(答案解析)...

    下面是Java程序员相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...

最新文章

  1. 2019年1月份访问量超过1千的文章
  2. 【计算机网络】HTTP 与 HTTPS ( HTTP 在网络各个层级的传输过程 | HTTPS 工作流程 | HTTPS 弊端 )
  3. 高仿美团钱包首页CollapsingToolbarLayout监听滑动隐藏效果(公司项目)
  4. 来自爸妈的敷衍问候!| 今日最佳
  5. openglshader实现虚拟场景_opengl+shader
  6. python邮件发送_Python实现邮件发送
  7. docker 删除默认连接_database – 如何从已删除的Docker容器中恢复数据?如何将其重新连接到数据?...
  8. Unity 2D教程: 滚动,场景和音效
  9. 2008年日历带农历_头条文章--Excel中带农历的万年历设计方法一
  10. [转]前端HTML书写不得不掌握的Emmet缩写语法
  11. python备注(持续更新……)
  12. 固态硬盘比机械硬盘到底快多少呢
  13. jetson nano 自动调节风扇转速
  14. php调用纯真ip,PHP调用纯真IP数据库返回具体地址
  15. (1)pytorch 实现 minist手写数据集(cpu/gpu)版本
  16. STM32CubeMx开发之路—13使用SPI读写W25Q64
  17. 三菱plc控制步进电机实例_自动化工程师必掌握的PLC控制步进电机逻辑思路
  18. 三只松鼠、良品铺子、百草味隐藏的巨大套利机会
  19. python opencv去图片水印(图片底色为白色)
  20. 阿里云国际版ECS云服务器ping不通的原因分析

热门文章

  1. 计算机网络文件丢失怎么找回,电脑上的数据误删除了怎么恢复?教你几招!
  2. 10万弹幕大军带你一起看芒果热播综艺《披荆斩棘的哥哥》
  3. word中logo如何与文字对齐
  4. 经济学模型2-生产可能性边界
  5. oracle中bulk,oracle---bulk collect 的用法
  6. matlab 射频滤波器,第12章射频(MATLAB仿真在现代通信中的应用).ppt
  7. 手势识别系统的发展前景
  8. 【华三H3C设备命令最全大合集】
  9. 第7次版本迭代的微信答题小程序完美上线
  10. 3万字干货HTML+CSS入门指南(建议收藏)