【Flutter 面試】main入口函數會被調用幾回

老孟導讀:這是一個讀者面試時被問到的問題,這個問題前段時間我也在VIP交流羣和你們一塊兒探討過。java

這個問題涉及引擎的相關知識,若是不瞭解相關知識,很難回答正確,由於無論說調用幾回都是錯誤的,下面來看一下引擎的相關知識。git

建立一個 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 頁面,返回,再次點擊跳轉:ide

日誌以下:函數

發現執行了2次main 入口函數ui

使用緩存引擎跳轉:this

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】:

相關文章
相關標籤/搜索