
1.1 Dart语言概述
Dart语言的最初定位是一种运行在浏览器中的脚本语言。因为使用JavaScript开发的程序混乱不堪,没有严谨的程序范式与语言数据类型限定,所以Dart就是为了解决JavaScript存在的在语言本质上无法改进的缺陷而设计的。
最初,Google自家的Chrome浏览器中内置了Dart虚拟机(Dart VM),可以直接高效地运行Dart代码。在2015年前后,由于少有项目使用Dart语言,所以Google将Dart VM引擎从Chrome中移除。再后来,Google内部孵化了开发移动框架Flutter,并且在Google的操作系统Fuchsia中,Dart被指定为官方的开发语言,前端开发框架的Angular也在持续迭代对应Dart版本的AngularDart。
Dart属于应用层编程语言,通常情况下运行在自己的虚拟机上,但是在特定情况下,它也可以编译成本机代码运行在硬件上(比如在移动开发框架中,Flutter会将代码编译成指定平台的本机代码以提高性能)。
1.1.1 Dart与Flutter的发展史
Google在2011年10月的丹麦GOTO大会上发布了Dart语言的第一个版本,Dart语言从诞生到现在已经有10年了。
Flutter是Google推出并开源的移动应用开发框架,采用的开发语言是Dart,开发者可以通过Dart语言开发APP,一套代码同时运行在多个平台。目前Flutter默认支持Android、iOS、Fuchsia三个移动平台,也支持Web开发(Flutter for Web)和PC开发。本书的示例和介绍主要是基于iOS和Android平台的。
Flutter第一个版本支持Android操作系统,开发代号称作Sky,于2015年4月的Flutter开发者会议上公布,然后在上海Google Developer Days的主题演讲中,Google宣布了Flutter Release Preview 2,这是Flutter 1.0之前的最后一个重要版本。
2018年12月4日,Flutter 1.0在Flutter Live活动中发布,是该框架的第一个“稳定”版本。
2019年12月11日,在Flutter Interactive活动上,Google发布了Flutter 1.12,宣布Flutter是第一个为环境计算设计的UI平台。
2020年5月6日,Flutter 1.17.0稳定版发布。
Google的发布声明称,Flutter 1.17.0版本关闭了Flutter 1.12版本的6339个问题,从231位贡献者那里合并了3164个提交请求,并修复了许多错误。与Flutter一同发布的还有Dart 2.8、iOS Metal渲染支持、新的Material组件和新的网络追踪调试工具等。
2020年8月6日,Flutter 1.20稳定版发布,Flutter 1.20基于Dart 2.9构建,提供了文字自动补全功能和全新的TimePicker风格,同时DatePicker也支持范围选择,引入InteractiveViewer组件用来简化手势缩放的操作,Slider、RangeSlider滑动条风格进行了更新,Visual Studio Code开发工具有更多的Flutter扩展工具。
2020年10月1日,Flutter 1.22发布,Flutter 1.22侧重于确保Android 11和iOS 14与Flutter兼容。
2021年3月4日,Flutter 2.0发布,在Flutter 2.0中,桌面和Web支持也正式进入stable渠道。
在2021年5月的Google I/O大会上,Flutter 2.2发布,其升级主要是新创建项目默认启用空类型安全(null safety)以及对Web应用提供了service workers后台缓存、Android应用中增加了延迟组件、iOS应用中增加着色器的预编译、DevTools套件的调试功能增加等。
1.1.2 编译模式概述
在程序开发中,编译模式一般分为JIT和AOT两大类。
JIT全称为Just in Time(即时编译),如V8 JS引擎,它能够即时编译和运行JavaScript代码。这种模式的优点就是可以直接将代码分发给用户,而不用考虑机器架构,缺点就是源代码量大,将会花费JIT编译器大量的时间和内存来编译和执行。
AOT全称为Ahead of Time(事前编译),典型的例子就是像C/C++代码需要被编译成特殊的二进制文件,才可以通过进程加载和运行。这种模式的优势就是速度快,在密集计算或者图形渲染的场景下能够获得比较好的用户体验。
在对Flutter APP进行代码开发时(Debug模式),使用热更新(Hot Reload)可以方便快速地刷新UI,同时也需要比较高的性能来进行视图渲染,所以Flutter在Debug模式下使用了Kernel Snapshot编译模式(Dart的bytecode模式,不区分架构,Flutter项目内也叫作Core Snapshot,可以归类为AOT编译)。
在生产阶段,应用需要非常快的速度,所以Flutter使用的是AOT编译模式。