zoukankan      html  css  js  c++  java
  • 【Flutter 面试】main入口函数会被调用几次

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

    修改引擎 Entrypointmain1

    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 入口函数

    总结

    通过上面的实验,总结如下:

    1. 入口函数 执行的次数取决于 引擎的启动次数,每启动一次引擎,执行一次入口函数
    2. 引擎的入口函数是可以指定的,默认是 main

    因此面试过程中,不管回答几次都是错误的。

    交流

    老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com

    欢迎加入Flutter交流群(微信:laomengit)、关注公众号【老孟Flutter】:

  • 相关阅读:
    RabbitMQ笔记-死信队列与延时队列
    设计模式-迭代器模式
    RabbitMQ笔记-Demo(C#)
    RabbitMQ笔记-消息追踪【未完成】
    RabbitMQ笔记-安装&命令
    RabbitMQ笔记-Exchange、Queue、Message详细说明
    MySQL笔记-MVCC【没写】
    MySQL笔记-基础知识
    多线程笔记-基础知识
    在Redis中进行分页排序查询【转】
  • 原文地址:https://www.cnblogs.com/mengqd/p/13875579.html
Copyright © 2011-2022 走看看