7

目前,我正在开发 React Native 项目,当我在运行项目后摇晃手机时,它会给我实时更新。因为我也使用过 Flutter,所以它也为我提供了相同的输出。但是,在 Android 中有一个称为 Instant Run 的功能。

我用谷歌搜索了即时运行。并且某些结果不同 Instant Run 不是 Android Studio 的 Hot Reload。

所以,我想知道 Instant Run 和 Hot Reload 在工作和功能上的显着差异是什么?

4

2 回答 2

9

我无法详细介绍技术细节,但这里有一些实际差异:

  • Flutter Hot Reload 比 Instant Run 快很多
  • Instant Run 有时会失败并导致完全重建,这可能需要几分钟。
  • Flutter Hot Reload 会在您保存文件时自动安排,并且没有延迟。Instant Run 会导致很多延迟,这会让人分心。
  • Flutter Hot Reload 不会丢失任何状态,而在使用 Instant Run 时,经常会发生应用程序被重置的情况
  • Flutter 还允许您在不到一秒的时间内重启应用(重置状态)(在 Android 中可能需要几分钟)
  • Flutter Hot Reload 也可以在应用程序处于后台时工作
  • 在对 Flutter 应用程序的原生 Android 和 iOS shell 进行更改时,Flutter Hot Reload 对您没有帮助。您必须使用 Gradle/XCode 进行完全重建(这也会重置状态)
于 2018-08-28T17:20:43.160 回答
7

Flutter 的Hot Reload和 Android Studio 的Instant Run的工作方式实际上几乎没有区别。

他们都检查代码更改,仅对已更改的内容执行编译步骤,然后将其发送到手机以运行。Android 和 Flutter 应用程序都运行一个能够动态更改类的 VM(jvm 或 dart vm)。


当您执行 Flutter Hot Reload时,它会执行一个快速增量编译步骤,然后将您的 dart 代码发送到手机,它几乎可以立即运行。这速度如此之快,部分原因是 Flutter 在调试模式下运行时使用了 JIT 编译模型,这意味着编译所花费的时间更少,但方法的第一次运行(或前几次运行)可能没有得到优化。在许多情况下,由于颤振的工作方式,状态在更改之间保持不变,而不是通过 dart JIT 处理固有的任何东西。对于某些事情(想到静态和 initState 函数),您实际上必须执行完全重新加载来重新初始化应用程序的状态,但仍然几乎是即时的。


Android Studio for Instant Run非常相似,但始终是完全编译的。VM 有一些工具,因此当调用方法时,VM 会检查是否已注入新类。Instant Run 会尽量少更换;如果它可以简单地替换一些它会的类,但它通常需要替换整个活动,有时甚至是整个应用程序。这是此博客中的一个很好的图表(如果您想更深入地了解,值得一读): 即时运行工作流程


从功能上讲,Instant RunHot Reload应该非常相似。但是,在实践中,我发现 Flutter 的Hot ReloadInstant Run快得多,尤其是对于任何大小的应用程序。

此外,我发现 Flutter 处理状态的方式比 Android 活动的工作方式更适合重新计算类。在 Flutter 中,您有许多与 UI 相关的类,每个类都有自己的状态,只需更改其中的几个就非常快。或者,在 Android 中,您倾向于拥有更大的 Views 或 Activity UI,这需要花费更多精力来替换,并且通常会导致重新加载 Activity,而不仅仅是一个类。

于 2018-08-28T19:21:21.063 回答