使用 Hot Reload 的步骤

  • 1、连接真机或虚拟机,运行 Flutter App,且必须以 Debug 模式启动。因为只有 Debug 模式才能使用 Hot Reload。
  • 2、修改 Flutter App 工程里面的 Dart 代码,但并不是所有 Dart 代码的修改都可以使用 Hot Reload,有一些情况下 Hot Reload 并不能生效,只能使用 Hot Restart(重新启动)。
  • 3、使用 cmd + s(MacOS),或者点击 Hot Reload 按钮,就完成了 Hot Reload 操作。

    Hot Reload 的工作原理

    Hot Reload 只能在 Debug 模式下使用,是因为 Debug 模式下,Flutter 采用的是 JIT 动态编译,代码是运行在 Dart VM 上,JIT 将 Dart 编译成可以运行在 Dart VM 上的 Dart Kernel,Dart Kernel 可以动态更新,所以就实现了代码的实时更新功能。
    当调用 Hot Reload 时:

  • 1、首先会扫描代码,找到上次编译之后有变化的 Dart 代码。

  • 2、再将这些变化的Dart 代码转化为增量的 Dart Kernel 文件。
  • 3、将增量的 Dart Kernel 文件发送到正在移动设备上运行的 Dart VM
  • 4、Dart VM 会将发来的增量 Dart Kernel 文件和原有的 Dart Kernel 文件合并。然后重新加载全新的 Dart Kernel。
  • 5、这个时候,虽然重新加载了 Dart Kernel,却不会重新执行代码,而是通知 Flutter Framework 重建 Widget。

所以 Flutter 的 Hot Reload 并不会重新执行一遍代码,而是触发 Flutter 重新绘制,并且会保留 Flutter 之前的状态,所以 Hot Reload 也被称为有状态的热重载。

不能使用 Hot Reload 的场景

在理解了 Hot Reload 的原理之后,可以看到 Hot Reload 的使用场景是有一些限制的,接下来我们在看一下不能使用 Hot Reload 的场景。

  • 1、代码出现编译错误的时候不能使用 Hot Reload。当代码更改引入编译错误时,肯定不能使用 Hot Reload。所以要先解决编译错误,再使用 Hot Reload。
  • 2、代码更改会影响 App 状态的不能使用 Hot Reload。如果你的代码更改会影响 App 状态。使得代码更改之后的状态和代码更改之前的状态不一样,那么 Hot Reload 就不会生效、
  • 3、全局变量(global variables)和静态字段(static fields)的更改不能使用 Hot Reload。在 Flutter 中,全局变量和静态字段被视为状态,因此在Hot Reload 期间不会重新初始化。
  • 4、main()方法里的更改不能使用 Hot Reload,因为main()方法不会因重建窗口小部件树而重新执行,所以更改main()方法里的代码,不会在 Hot Reload 之后看到效果。
  • 5、枚举类型更改为常规的类或者常规的类变为枚举类型也不能使用 Hot Reload。
  • 6、修改通用类型声明也不能使用 Hot Reload。针对上面不能使用 Hot Reload 的情况,就需要使用 Hot Restart、Hot Restart 可以完全重启您的应用程序,但却不用结束调试会话、

直接快捷键 Ctrl + F5,就可以使用 Hot Restart。