关于flutter:Flutter-面试main入口函数会被调用几次

25次阅读

共计 2035 个字符,预计需要花费 6 分钟才能阅读完成。

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

这个问题波及 引擎 的相干常识,如果不理解相干常识,很难答复正确,因为不论说调用几次都是 谬误的 ,上面来看一下 引擎 的相干常识。

创立一个 Flutter 我的项目,而后运行,main 入口函数 只会执行一次,上面批改我的项目的 MainActivity,

class MainActivity : Activity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<Button>(R.id.button).setOnClickListener {startActivity(Intent(this, FlutterActivity::class.java))
        }
    }
}

将其批改为一个一般的 Activity(原来是 FlutterActivity),增加一个按钮,跳转到 FlutterActivity,加载 Flutter 页面。

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

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

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

日志如下:

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

应用缓存引擎跳转:

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

findViewById<Button>(R.id.button).setOnClickListener {
    startActivity(
            FlutterActivity
                    .withCachedEngine("engine_id")
                    .build(this)
    )
}

运行,发现还没有点击跳转,就执行了 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<Button>(R.id.button).setOnClickListener {
            startActivity(
                    FlutterActivity
                            .withCachedEngine("engine_id")
                            .build(this)
            )
        }
    }

    fun createEntrypoint(): DartExecutor.DartEntrypoint {val flutterLoader: FlutterLoader = FlutterInjector.instance().flutterLoader()
        return DartExecutor.DartEntrypoint(flutterLoader.findAppBundlePath(), "main1")
    }
}

此时执行的是 main1 入口函数

总结

通过下面的试验,总结如下:

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

因而面试过程中,不论答复几次都是谬误的。

交换

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

欢送退出 Flutter 交换群(微信:laomengit)、关注公众号【老孟 Flutter】:

正文完
 0