1.Flutter是怎么实现热重载的,原理和过程是怎么样的?
Flutter热重载是基于State的,也就是我们在代码中经常出现的setState方法,通过这个来修改后,会执行相应的build方法,这就是热重载的基本过程。
实现源码在下面路径中,包含文件run_cold.dart和run_hot.dart两个文件,前者负责冷启动,后者负责热重载。
~/flutter/packages/flutter_tools/lib/src/run_hot.dart
热重载实现过程:
代码在run_hot.dart文件中,HotRunner负责具体代码执行。
当Flutter热重载时,调用restart函数,函数内部会传入一个fullRestart的bool类型变量。
热重载分为全量和非全量,fullRestart参数金牛是表示是否为全量。
以非全量热重载为例,函数的fullRestart会传入false,根据传入false参数,下面是哪部核心代码。
Future<OperationResult> restart(
{bool fullRestart = false,
bool pauseAfterRestart = false,
String reason}) async {
if (fullRestart) {
// .....
} else {
final bool reloadOnTopOfSnapshot = _runningFromSnapshot;
final String progressPrefix =
reloadOnTopOfSnapshot ? 'Initializing' : 'Performing';
final Status status = logger.startProgress('$progressPrefix hot reload...',
progressId: 'hot.reload');
OperationResult result;
try {
result = await _reloadSources(pause: pauseAfterRestart, reason: reason);
} finally {
status.cancel();
}
}
}
调用Restart函数后,内部会调用_reloadSources函数,去执行内部逻辑。
执行流程图:

图解:
在_reloadSources函数内部,会调用_updateDevFs函数,函数内部会扫描修改的文件,并将修改的文件进行对比,随后将被改动代码生成一个kernel files文件。
然后通过HTTP Server将生成的kernel files文件发送给Dart VM虚拟机,虚拟机拿到kernel文件后会调用_reloadSources函数进行资源重载,将kernel文件注入正在运行的Dart VM中,当资源重载完成后,会调用RPC接口触发Widgets的重绘。