我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flutter初始化流程是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flutter初始化流程是怎样的

本篇内容介绍了“Flutter初始化流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Flutter初始化时序

Flutter初始化主要分四部分,FlutterMain初始化、FlutterNativeView的初始化、FlutterView初始化和Flutter Bundle初始化。

  • PlatformViewAndroid::PlatformViewAndroid()    : PlatformView(std::make_unique<NullRasterizer>()),      android_surface_(InitializePlatformSurface()) {}void PlatformViewAndroid::Attach() {  CreateEngine();  // Eagerly setup the IO thread context. We have already setup the surface.  SetupResourceContextOnIOThread();  UpdateThreadPriorities();
  • 其中:
    1. PlatformViewAndroid的构造函数主要是调用了InitializePlatformSurface方法,这个方法主要是初始化了Surface,其中Surface有Vulkan、OpenGL和Software三种类型的区别。
    2. PlatformViewAndroid::Attach方法这里主要调用三个方法:CreateEngine、SetupResourceContextOnIOThread和UpdateThreadPriorities。
    2.1 CreateEngine比较好理解,创建Engine,这里会重新创建一个Engine对象。
    2.2 SetupResourceContextOnIOThread是在IO线程去准备资源的上下文逻辑。
    2.3 UpdateThreadPriorities是设置线程优先级,这设置GPU线程优先级为-2,UI线程优先级为-1。

    FlutterView初始化

    FlutterView的初始化就是纯粹的Android层啦,所以相对比较简单。分析FlutterView.java的构造函数就会发现,整个FlutterView的初始化在确保FlutterNativeView的创建成功和一些必要的view设置之外,主要做了两件事:
    1. 注册SurfaceHolder监听,其中surfaceCreated回调会作为Flutter的第一帧回调使用。
    2. 初始化了Flutter系统需要用到的一系列桥接方法。例如:localization、navigation、keyevent、system、settings、platform、textinput。
    FlutterView初始化流程主要如下图所示:

    Flutter初始化流程是怎样的

    Flutter Bundle初始化

    Flutter Bundle的初始化是由调用FlutterActivityDelegate.runFlutterBundle开始的

    我们再从源码角度较为深入了解下:

    FlutterActivity的onCreate方法在执行完FlutterActivityDelegate的onCreate方法之后会调用它的runFlutterBundle方法。runFlutterBundle代码如下:

    public void runFlutterBundle(){    // other codes ...    String appBundlePath = FlutterMain.findAppBundlePath(activity.getApplicationContext());    if (appBundlePath != null) {        flutterView.runFromBundle(appBundlePath, null, "main", reuseIsolate);    }}

    很明显,这个runFlutterBundle并没有做太多事情,而且直接调用了FlutterView.runFromBundle方法。而后兜兜转转最后会调用到PlatformViewAndroid::RunBundleAndSnapshot方法。

    void PlatformViewAndroid::RunBundleAndSnapshot(JNIEnv* env, std::string bundle_path,                                               std::string snapshot_override,                                               std::string entrypoint,                                               bool reuse_runtime_controller,                                               jobject assetManager) {  // other codes ...  blink::Threads::UI()->PostTask(      [engine = engine_->GetWeakPtr(),       asset_provider = std::move(asset_provider),       bundle_path = std::move(bundle_path), entrypoint = std::move(entrypoint),       reuse_runtime_controller = reuse_runtime_controller] {        if (engine)          engine->RunBundleWithAssets(              std::move(asset_provider), std::move(bundle_path),              std::move(entrypoint), reuse_runtime_controller);      });}

    PlatformViewAndroid::RunBundleAndSnapshot在UI线程中调用Engine::RunBundleWithAssets,最终调用Engine::DoRunBundle。
    DoRunBundle方法最后只会调用RunFromPrecompiledSnapshot、RunFromKernel和RunFromScriptSnapshot三个方法中的一个。而这三个方法最终都会调用SendStartMessage方法。

    bool DartController::SendStartMessage(Dart_Handle root_library,                                      const std::string& entrypoint) {  // other codes ...  // Get the closure of main().  Dart_Handle main_closure = Dart_GetClosure(      root_library, Dart_NewStringFromCString(entrypoint.c_str()));  // other codes ...  // Grab the 'dart:isolate' library.  Dart_Handle isolate_lib = Dart_LookupLibrary(ToDart("dart:isolate"));  DART_CHECK_VALID(isolate_lib);  // Send the start message containing the entry point by calling  // _startMainIsolate in dart:isolate.  const intptr_t kNumIsolateArgs = 2;  Dart_Handle isolate_args[kNumIsolateArgs];  isolate_args[0] = main_closure;  isolate_args[1] = Dart_Null();  Dart_Handle result = Dart_Invoke(isolate_lib, ToDart("_startMainIsolate"),                                   kNumIsolateArgs, isolate_args);  return LogIfError(result);}

    而SendStartMessage方法主要做了三件事:
    1. 获取Flutter入口方法(例如main方法)的closure。
    2. 获取FlutterLibrary。
    3. 发送消息来调用Flutter的入口方法。

“Flutter初始化流程是怎样的”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flutter初始化流程是怎样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flutter初始化流程是怎样的

本篇内容介绍了“Flutter初始化流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flutter初始化时序Flutter初始化主
2023-06-04

Java程序初始化顺序是怎么样的

这篇文章主要为大家展示了“Java程序初始化顺序是怎么样的”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java程序初始化顺序是怎么样的”这篇文章吧。Java程序的初始化一般遵循三个原则(优先级
2023-06-26

C++11列表初始化是怎样的

这篇文章主要介绍“C++11列表初始化是怎样的”,在日常操作中,相信很多人在C++11列表初始化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11列表初始化是怎样的”的疑惑有所帮助!接下来,请跟
2023-06-19

FlexApplication初始化顺序是怎么样的

这篇文章将为大家详细讲解有关FlexApplication初始化顺序是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Flex组件在建立的时候都会经历四个事件:preinitialize, init
2023-06-17

Vue Router中Matcher的初始化流程是什么

这篇文章主要讲解了“Vue Router中Matcher的初始化流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue Router中Matcher的初始化流程是什么”吧!Match
2023-06-30

Win10怎样初始化电脑?Win10初始化电脑的方式

当电脑初始化系统软件后操作系统会复原到刚安裝情况并清理数据文档,也就是等同于将电脑恢复到刚选购时的情况。那麼Win10应当怎样初始化电脑呢?还不清楚具体步骤的小伙伴们,可以参照下列实际操作哦,期待对你有些协助。Win10初始化电脑的方式:1
2023-07-14

.NET Framework初始化相关实现技巧是怎样的

本篇文章给大家分享的是有关.NET Framework初始化相关实现技巧是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。如何正确的应用.NET Framework,决定了
2023-06-17

WCF序列化流程是怎样的

本篇内容介绍了“WCF序列化流程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么WCF序列化:我们这里先来介绍一下为什么需要序列
2023-06-17

spring初始化bean的过程是什么

Spring初始化Bean的过程如下:定义Bean:通过在配置文件或者注解中定义Bean的信息,包括Bean的名称、类别、属性等。加载配置文件:Spring容器会读取配置文件,解析其中的Bean定义。创建Bean实例:根据Bean定义中的类
spring初始化bean的过程是什么
2024-02-29

Java类的初始化过程是什么

Java类的初始化过程包括以下几个步骤:加载类:当程序中使用到某个类时,Java虚拟机会先通过类加载器将该类的字节码文件加载到内存中。链接:链接是将被加载的类合并到Java虚拟机的运行时环境中的过程,包括验证、准备和解析三个阶段。验证:验证
2023-10-26

java继承关系的类初始化和实例化顺序是怎样的

这期内容当中小编将会给大家带来有关java继承关系的类初始化和实例化顺序是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例
2023-06-17

Spring Security基本架构与初始化操作流程是什么

这篇文章主要介绍“Spring Security基本架构与初始化操作流程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Security基本架构与初始化操作流程是什么”文章能帮助大
2023-07-05

初始化vue项目的过程 是什么

本篇内容主要讲解“初始化vue项目的过程 是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“初始化vue项目的过程 是什么”吧!在命令行执行命令“vue init webpack vue-pr
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录