【Flutter 面试】main入口函数会被调用几次

【Flutter 面试】main入口函数会被调用几次_第1张图片

老孟导读:这是一个读者面试时被问到的问题,这个问题前段时间我也在 VIP交流群和大家一起探讨过。

这个问题涉及引擎的相关知识,如果不了解相关知识,很难回答正确,因为不管说调用几次都是错误的,下面来看一下引擎的相关知识。

创建一个 Flutter 项目,然后运行,main入口函数 只会执行一次,下面修改项目的 MainActivity ,

class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById

将其修改为一个普通的 Activity(原来是 FlutterActivity),添加一个按钮,跳转到 FlutterActivity,加载 Flutter 页面。

在 flutter 的 main 入口函数处添加日志:

void main() {
  runApp(MyApp());
  print('===main====');
}

运行,点击跳转,跳转到了Flutter 页面,返回,再次点击跳转:

日志如下:

【Flutter 面试】main入口函数会被调用几次_第2张图片

发现执行了2次main 入口函数

使用缓存引擎跳转:

val flutterEngine = FlutterEngine(this)
flutterEngine.dartExecutor.executeDartEntrypoint(
        DartExecutor.DartEntrypoint.createDefault()
)
FlutterEngineCache
        .getInstance()
        .put("engine_id", flutterEngine)

findViewById

【Flutter 面试】main入口函数会被调用几次_第3张图片

运行,发现还没有点击跳转,就执行了1次main 入口函数,点击跳转,然后这次不在执行 main 入口函数。

增加一个函数 main1:

void main() {
  runApp(MyApp());
  print('===main====');
}

void main1() {
  runApp(MyApp());
  print('===main1====');
}

修改引擎 Entrypointmain1

class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val flutterEngine = FlutterEngine(this)
        flutterEngine.dartExecutor.executeDartEntrypoint(
//            DartExecutor.DartEntrypoint.createDefault()
                createEntrypoint()
        )
        FlutterEngineCache
                .getInstance()
                .put("engine_id", flutterEngine)

        findViewById

【Flutter 面试】main入口函数会被调用几次_第4张图片

此时执行的是 main1 入口函数

总结

通过上面的实验,总结如下:

  1. 入口函数 执行的次数取决于 引擎的启动次数,每启动一次引擎,执行一次入口函数
  2. 引擎的入口函数是可以指定的,默认是 main

因此面试过程中,不管回答几次都是错误的。

交流

老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com

欢迎加入Flutter交流群(微信:laomengit)、关注公众号【老孟Flutter】:

你可能感兴趣的:(flutter)