一文带你弄懂Flutter的热部署

开发 前端
Dart在开发过程中使用JIT,每次更改都不需要在编译成字节码,节省了大量时间,在部署中使用AOT生成高效的ARM代码保证高效的性能,所以说Dart具有运行速度快,执行性能好的特点。

关于Dart中的运行方式

  • JIT:Just In Time . 动态解释,一边翻译一边执行,也称为即时编译,如JavaScript,Python等,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但是运行速度和性能则会受到影响,Flutter中的热重载正是基于此特性
  • AOT: Ahead of Time. 静态编译,是指程序在执行前全部被翻译为机器码,提前编译,如 C ,C++ ,OC等,发布时期使用AOT,就不需要像RN那样在跨平台JavaScript代码和原生Android、iOS代码间建立低效的方法调用映射关系。

程序的运行方式和具体的语言没有强制关系,比如python,既可以是JIT 也可以是AOT,Dart是少数同时支持JIT和AOT的语言之一。

Dart在开发过程中使用JIT,每次更改都不需要在编译成字节码,节省了大量时间,在部署中使用AOT生成高效的ARM代码保证高效的性能,所以说Dart具有运行速度快,执行性能好的特点。

Hot Reload

在Dart代码文件中修改字符串“Hello, World”,添加一个惊叹号,点击保存或者热刷新按钮就可以立即更新到界面上,仅需几百毫秒:

Flutter通过将新的代码注入到正在运行的DartVM中,来实现Hot Reload这种神奇的效果,在DartVM将程序中的类结构更新完成后,Flutter会立即重建整个控件树,从而更新界面。但是热刷新也有一些限制,并不是所有的代码改动都可以通过热刷新来更新:

  1. 编译错误,如果修改后的Dart代码无法通过编译,Flutter会在控制台报错,这时需要修改对应的代码。
  2. 控件类型从StatelessWidgetStatefulWidget的转换,因为Flutter在执行热刷新时会保留程序原来的state,而某个控件从stageless→stateful后会导致Flutter重新创建控件时报错“myWidget is not a subtype of StatelessWidget”,而从stateful→stateless会报错“type ‘myWidget’ is not a subtype of type ‘StatefulWidget’ of ‘newWidget’”。
  3. 全局变量和静态成员变量,这些变量不会在热刷新时更新。
  4. 修改了main函数中创建的根控件节点,Flutter在热刷新后只会根据原来的根节点重新创建控件树,不会修改根节点。
  5. 某个类从普通类型转换成枚举类型,或者类型的泛型参数列表变化,都会使热刷新失败。

热刷新无法实现更新时,执行一次热重启(Hot Restart)就可以全量更新所有代码,同样不需要重启App,区别是restart会将所有Dart代码打包同步到设备上,并且所有状态都会重置。

责任编辑:姜华 来源: 今日头条
相关推荐

2022-08-03 08:01:16

CDN网站服务器

2023-12-12 07:31:51

Executors工具开发者

2023-03-27 17:58:34

MySQL加锁间隙锁

2023-10-26 16:27:50

前端 WebCSS开发

2023-09-18 08:02:45

CSS布局属性

2022-09-05 09:25:53

KubernetesService

2023-04-04 08:01:47

2022-09-09 10:00:13

KubernetesConfigMap

2023-03-31 08:16:53

Flutter优化内存管理

2023-11-28 09:31:55

MySQL算法

2022-09-01 08:01:56

Pythongunicorn

2022-08-09 09:10:43

Kubernetes容器

2021-05-29 10:11:00

Kafa数据业务

2023-07-31 08:18:50

Docker参数容器

2022-11-11 19:09:13

架构

2023-11-06 08:16:19

APM系统运维

2021-12-20 07:59:07

Go语言结构体

2021-06-02 05:43:36

比特币虚拟货币区块链

2022-01-04 08:54:32

Redis数据库数据类型

2019-09-23 10:51:14

JavaJava虚拟机Linux
点赞
收藏

51CTO技术栈公众号