1.知识点总结

1. Flutter简介以及Flutter Boost产生的原因

Flutter是一个由C++实现的Flutter Engine和由Dart实现的Framework组成的跨平台的技术框架。

其中,Flutter Engine负责线程管理、Dart VM状态管理以及Dart代码加载等工作。Dart代码所实现的Framework则负责上层业务开发,如Flutter提供的组建等概念就是Framework的范畴。

Flutter开发会遇到的问题,在Flutter页面和原生页面共存的情况下,如何管理路由,以及原生页面与Flutter页面的切换和通信问题。

多引擎模式:多个主Isolate存在。

多引擎模式问题:

  • 冗余资源问题,多引擎模式下,每个引擎的Isolate是相互独立的,由于每个引擎底层都维护了一套图片缓存等比较消耗内存的对象,设备的内存消耗是非常严重的。
  • 插件注册问题,Flutter插件中,消息传递需要依赖Messenger,而Messenger是由FlutterViewController去实现的。当一个应用中存在多个FlutterViewController时,那么插件的注册和通信会变得混乱而难以维护。
  • Flutter组建和原生页面的差异化问题,希望消除两者的差异,否则在进行页面埋点和其他操作时会增加一些额外的工作量。
  • 增加页面通信的复杂度,多个引擎实例会让Isolate的管理变得更加复杂。

Flutter Boost是闲鱼技术团队的一个可复用页面的插件,旨在把Flutter容器做成类似浏览器的加载方案。

此方案的基本功能:

  1. 可复用的通用型混合开发方案
  2. 支持更加复杂的混合模式,比如支持tab切换的场景
  3. 无侵入性方案,使用时不再依赖修改Flutter的方案
  4. 支持页面生命周期统一的管理。
  5. 具有统一明确的设计概念

2.Flutter Boost的接入

1.在pubspec.yaml中添加Flutter Boost依赖插件。

2.1 Android

1.在settings.gradle中添加绑定

2.在build.gradle中添加依赖

3.MyApplication继承Flutter Application

4.AndroidManifest.xml中生命MyApplication和FlutterBoostActivity

2.2 IOS

3. Flutter Boost架构

页面的定义:

原生端,页面通常是一个ViewController或者Activity;

Flutter端,页面通常是指Flutter组件。

FlutterBoost框架是统一混合工程中的页面概念,或者弱化Flutter组件对应容器页面的概念。当有一个原生页面存在时,FlutterBoost就能保证一定有一个对应的Flutter的容器页面存在???

本质:

由原生容器通过消息驱动Flutter页面容器,从而达到原生容器与Flutter容器同步的目的,而Flutter渲染的内容是由原生容器去驱动的。通过共享同一个引擎的方案,在Dart端引入容器概念,当存在多个Flutter页面时,不通过栈结构去维护现有页面,而是使用扁平化键值对映射的形式去维护当前所有的页面,并且每个页面拥有唯一的ID。

2.疑问点汇总

  • 多引擎模式:多个主Isolate存在。

    • Isolate是Dart的线程概念。与java的thread不同,各个Isolate是无法共享内存空间的。
    • 每个isolate具有自己的堆内存以确保其状态不会被其他isolates访问,具有自己的事件循环和队列。代码按照顺序执行。
    • 通信的唯一方式是通过Port进行,消息传递总是异步的。
    • flutter中封装好的isolate使用时通过compute方法进行的。
  • Messenger和FlutterViewController

    • Messenger应该是用于Flutter与原生通信的消息传递。

    • FlutterViewController是iOS的,与此对应的Android是Flutter View。

    • Flutter中定义了三种不同类型的PlatformChannel,分别是

      • MethodChannel:用于传递方法调用,是比较常用的
      • EventChannel:用于传递事件
      • BasicMessageChannel:用于传递数据
    • BinaryMessenger
      BinaryMessenger是PlatformChannel与Flutter端的通信的工具,其通信使用的消息格式为二进制格式数据,BinaryMessenger在Android中是一个接口,它的实现类为FlutterNativeView

    • Codec
      Codec是消息编解码器,主要用于将二进制格式的数据转化为Handler能够识别的数据,Flutter定义了两种Codec:MessageCodec和MethodCodec。MessageCodec用于二进制格式数据与基础数据之间的编解码,BasicMessageChannel所使用的编解码器是MessageCodec。MethodChannel和EventChannel所使用的编解码均为MethodCodec。

    • Handler
      Flutter定义了三种类型的Handler,它们与PlatformChannel类型一一对应,分别是MessageHandler、MethodHandler、StreamHandler。在使用PlatformChannel时,会为它注册一个Handler,PlatformChannel会将该二进制数据通过Codec解码为转化为Handler能够识别的数据,并交给Handler处理。当Handler处理完消息之后,会通过回调函数返回result,将result通过编解码器编码为二进制格式数据,通过BinaryMessenger发送回Flutter

      MethodChannel可以实现Flutter调用Android,也可以实现Android调用Flutter

      参考文档https://blog.csdn.net/itachi85/article/details/99780766

  • Flutter Boost如何进行生命周期管理

    • Flutter的生命周期:三个阶段:

      • 1.实例化组件并添加到树,Navigator.push

      • 2.状态变化,即打开新的widget或者依赖的上级widget发生变化

      • 3.从树中移除,Navigator.pop

      • 生命周期函数

        • 构造函数
        • createState
        • initState。插入到渲染树时调用,只执行一次,类似onCreateView
        • didChangeDependencies:在initState后执行,显示/关闭其他widget,可多次执行
        • build
        • Deactive,类似onStop方法,重新打开widget或者回到该widget时会执行,可多次执行
        • dispose:onDestory,在执行Navigator.pop后执行,表示该组件已销毁。
        • Reassemble:点击闪电时执行,只用于调试时的hot reload
      • 常见业务场景:

        • Widget A打开Widget B: Navigator.push(B)

          • B构造函数—>B initState—>B didChangeDependencies—>B build—>A deactive—>A didChangeDependencies.

          • Widget B退出: Navigator.pop

            • A deactive—>A didChangeDependencies—>A build—>B deactive—>B dispose。
            • 可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。
            • 参考文档:https://www.jianshu.com/p/7e8dff26f81a
    • Flutter提供了WidgetsBindingObserver来监听AppLifecycleState。AppLifecycleState有四种状态。

      • resumed,界面可见
      • inactive,界面退到后台或者弹出弹窗的情况下,失去焦点,但是可以drawframe回调, onPause
      • Paused,后台,同onStop
      • Suspending, ios中没用,Android是挂起,不再执行drawframe回调
    • 下面是生命周期:

      • 1、初次打开widget时,不执行AppLifecycleState的回调;
      • 2、按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause
      • 3、从后台到前台:AppLifecycleState inactive—>ApplifecycleState resumed
      • 4、back键退出应用: AppLifecycleState inactive—>AppLifecycleState paused
      • 参考文档:https://www.jianshu.com/p/7e8dff26f81a
    • https://www.jianshu.com/p/6ed6f7de01ff 参考文档

      • clean state --干净的state,表示当前build出来的widget,下一次重绘检查时不需要build

  • 页面容器

    • 页面,通常说的页面在 Flutter 中指的是Route,在 Android 中指的是Activity,iOS 中指的是 ViewController
    • Flutter 容器:Flutter 容器提供了 Dart 代码的运行时环境,一般包含容器类、显示视图和引擎三部分:
      • FlutterActivity/FlutterViewController:官方提供的显示 Flutter⻚面容器基础类,FlutterActivity 是 Android 端基础类,FlutterViewController 对应 iOS 端基础类。
      • FlutterView:是显示 Flutter Widget 的视图。
      • FlutterEngine:是一个用于承载 Flutter 应用的可移植的运行时。它实现了 Flutter 的核心库,包括动画和图形、文件和网络 I/O、可访问性支持、插件架构,以及 Dart 运行时和编译工具链。
    • initialRouteinitialRoute 是 Flutter 页面的路由标识。
    • NavigatorNavigator 是管理 Route 的类,它通过 Overlay 栈来管理活动的 Route。
    • 参考文档:https://www.infoq.cn/article/jFaFiKtQQgsVVqHNixQc 贝壳flutter混合容器实践
  • 栈结构

3.参考文档

isolate

Flutter boost框架学习笔记相关推荐

  1. SpringMVC框架--学习笔记(下)

    接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...

  2. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  3. mybatis框架--学习笔记(下)

    上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...

  4. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  5. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  6. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  7. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...

  8. [Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP

    上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现JDBC 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringA ...

  9. Samza框架-----学习笔记

    Samza框架-----学习笔记 基本概念: 作业:是对一组输入流进行处理转化成输出流的程序. 分区: Samza的流数据单位既不是Storm中的元组,也不是Spark Streaming中的DStr ...

最新文章

  1. 【TX2】安装NVIDIA SDK Manager(JetPack 4.6)后,下载kernel和u-boot源码
  2. JSP关于Frameset的简单用法
  3. 圈子 | 苏宁易购产品经理:平台支撑型产品的思维方式
  4. 分享WCF聊天程序--WCFChat
  5. 服务器漏洞处理_wildfly禁用https和8443端口
  6. MAC 安装brew raw.githubusercontent.com port 443: Connection refused 本人亲自认证过,踩过多种方案,最终认证的解决方案
  7. 亚马逊、Facebook、Google 等科技公司为何越来越难招到人了?
  8. ARKit 和 ARCore概念介绍
  9. c++矩阵转置_线性代数(Gelbert)对称矩阵
  10. 苹果手机连接Wifi认证机制
  11. 弹出USB大容量存储设备时出问题“该设备正在使用中”
  12. 微软邮箱(@outlook.com/@hotmail.com):双重验证+应用密码
  13. 20行Python小程序批量删除GitHub仓库,包
  14. 简单的node文件上传下载及中文乱码问题解决
  15. mac重装系统 未能与恢复服务器,Mac系统重装后数据可不可以恢复
  16. c语言中,exit(1)是什么意思?
  17. 英伟达或推出没有光线追踪的新款图灵架构GPU,这里有几个猜想...
  18. 《Linux内核分析》期中总结
  19. sim卡没坏但苹果手机无服务_苹果手机无服务是哪坏了?修好要多少钱?
  20. Java——设计模式(结构型模式)

热门文章

  1. 苹果为什么要禁止 JSPatch 等热更新技术?
  2. [JavaScript]什么是魔术字符串?
  3. Python中的以下划线“__“开头的方法——魔术方法使用指向
  4. Qt界面UI文件的使用与界面继承问题
  5. CentOS7 配置聚合链路
  6. java class文件防止反编译
  7. [案例]飞蚁代理使用说明
  8. 报告| 7月区块链游戏行业全景:玩赚游戏持续火爆,链游用户指数级增长
  9. Apache下的AllowOverride和.htaccess
  10. Nuke插件安装方法