【Flutter 面试】main入口函数会被调用几次
source link: http://www.cnblogs.com/mengqd/p/13875579.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
老孟导读:这是一个读者面试时被问到的问题,这个问题前段时间我也在 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】:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK