8

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

 3 years ago
source link: http://www.cnblogs.com/mengqd/p/13875579.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Bfa2Aff.png!mobile

老孟导读:这是一个读者面试时被问到的问题,这个问题前段时间我也在 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 页面,返回,再次点击跳转:

AbiEzen.gif!mobile

日志如下:

q6bEBbI.png!mobile

发现执行了 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)
    )
}

iaqmIbZ.png!mobile

运行,发现还没有点击跳转,就执行了 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")
    }
}

eIRVJra.png!mobile

此时执行的是 main1 入口函数

总结

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

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

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

交流

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

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

aMFjMbR.png!mobilejyeQVz3.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK