老孟导读 :这是一个读者面试时被问到的问题,这个问题前段时间我也在VIP交流群 和大家一起探讨过。
这个问题涉及引擎 的相关知识,如果不了解相关知识,很难回答正确,因为不管说调用几次都是错误的 ,下面来看一下引擎 的相关知识。
创建一个 Flutter 项目,然后运行,main入口函数 只会执行一次,下面修改项目的 MainActivity ,
class MainActivity : Activity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById(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(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(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】