2022年最新面试题Flutter(持续更新)

1,030 阅读1分钟

1.Flutter是怎么实现热重载的,原理和过程是怎么样的?

Flutter热重载是基于State的,也就是我们在代码中经常出现的setState方法,通过这个来修改后,会执行相应的build方法,这就是热重载的基本过程。

实现源码在下面路径中,包含文件run_cold.dartrun_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的重绘。