老孟导读:这是一个读者面试时被问到的问题,这个问题前段时间我也在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】: