https://github.com/dart-lang/sdk/wiki/Hot-reload

dart vm支持修改运行中的程序,这个特性就是hot reload。hot reload的行为主要包括:

  • 程序的每一次方法调用看起来都需要重新确定确定要调用的方法;
  • reload的最小单位是方法调用。reload并不会改变之前的方法,而是会将新的方法插入到方法字典中,并让下一次对方法的查找返回新插入的方法;
  • 变量值不会改变;

由于以上行为,hot reloading只会改变程序接下来的行为,无法根据reload之后的代码修正程序当前的状态。

Pervasive late-binding

正常情况下dart vm会对方法调用设计的方法字典查询进行一系列优化,包括inline和cache,但如果是在支持hot reload的debug模式下,这些优化全部都被关闭了,因此每次方法调用都会执行方法查询。

Immutable methods

hot reload的基础单位是方法。方法内容永不改变。代码中的任何修改都会导致新的方法被创建,class或者library的相关方法字典被修改以指向新的方法。老的方法,如果被closure变量引用,或者正在stack中,依然可能会被调用到。

State is retained

hot reload并不会重置变量。重置所有变量相当于是一次重启,而不是一次hot reload。
因此,修改变量引用后执行hot reload,并不会导致变量引用改变。
不过,针对static变量,由于它们是懒初始化的,因此如果在hot reload之前从来没有触发过这种变量的初始化,那么hot reload之后这样的变量会使用新的代码初始化,因此会被赋予新的引用。

Limitations

Dart VM会拒绝无法使用hot reload正确应对的变更。当hot reload被拒绝,什么都不会发生,应用程序继续执行。

Defects

另外一些情况下,Dart VM虽然会执行hot reload,但由于上面介绍的hot reload的行为准则,hot reload后程序的行为很可能和你的预期不符。因此,如果代码变更较大,不仅仅涉及到方法内容的简单修改的话,测试时最好还是不要太过依赖hot reload。

Flutter

https://flutter.dev/docs/development/tools/hot-reload
flutter会在hot reload后重新触发一次build/layout/paint。