老孟導讀:這是一個讀者面試時被問到的問題,這個問題前段時間我也在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====');
}
修改引擎 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 入口函數。
總結
通過上面的實驗,總結如下:
- 入口函數 執行的次數取決於 引擎的啟動次數,每啟動一次引擎,執行一次入口函數 。
- 引擎的入口函數是可以指定的,默認是 main。
因此面試過程中,不管回答幾次都是錯誤的。
交流
老孟Flutter博客(330個控件用法+實戰入門系列文章):http://laomengit.com
歡迎加入Flutter交流群(微信:laomengit)、關注公眾號【老孟Flutter】:
![]() |
![]() |