老孟導讀:這是一個讀者面試時被問到的問題,這個問題前段時間我也在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===='); }
修改引擎 Entrypoint 爲 main1:
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 入口函數。
經過上面的實驗,總結以下:
所以面試過程當中,無論回答幾回都是錯誤的。
老孟Flutter博客(330個控件用法+實戰入門系列文章):http://laomengit.com
歡迎加入Flutter交流羣(微信:laomengit)、關注公衆號【老孟Flutter】: