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

老孟导读:这是一个读者面试时被问到的问题,这个问题前段时间我也在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】:

posted on   老孟Flutter  阅读(1191)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示