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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM