Flutter技术解析与实战——闲鱼技术演进与创新-第1章(9)

简介: 本书将详细讲解闲鱼Flutter&FaaS云端一体化架构,以及闲鱼基于Flutter的架构演进与创新,学习一套全面的Flutter架构应用方案。本书介绍闲鱼技术团队利用Flutter技术改造和上线复杂业务的混合工程改造实践,抽取Flutter依赖到远程的实现细节,以及使用Plugin桥接获取设备信息、使用基础网络库等混合开发实践指南。这些实践遍布闲鱼各大业务线和应用场景,为读者使用Flutter打造自己的研发体系探索一条实践之路。除了介绍闲鱼Flutter应用框架Fish Redux、开发利器AspectD、FlutterBoost等一众开源工具与开发实践指南,你还将在......

1.5 使用混合栈框架开发

1.5.1 为什么需要混合方案

      具有一定规模的App 通常有一套成熟通用的基础库,尤其是阿里巴巴App,一般需要依赖很多体系内的基础库。使用Flutter 重新开发App 的成本和风险都较高。所以,在Native App 进行渐进式迁移是稳健型方式。闲鱼在实践中沉淀出一套自己的混合技术方案。在此过程中,闲鱼跟GoogleFlutter 团队进行密切的沟通,听取了他们的一些建议,同时也针对自身业务情况进行方案的选型以及具体的实现方法。

1.5.2 Google 官方提出的混合方案

1.基本原理

      Flutter 技术链主要由C++实现的Flutter Engine 和Dart 实现的Framework 组成。Flutter Engine 负责线程管理、Dart VM 状态管理和Dart代码加载等工作。而Dart 代码所实现的Framework 则是业务接触到的主要API,如Widget 等概念就是在Dart 层面的Framework 内容。

      一个进程里面最多只会初始化一个Dart VM。然而,一个进程可以有多个Flutter Engine,多个Engine 实例共享同一个Dart VM。

      我们来看具体实现方法,在iOS 中,每初始化一个FlutterViewController就会有一个引擎随之初始化,也就意味着会有新的线程(理论上线程可以复用)去运行Dart 代码。Android 中的Activity 也有类似的效果。如果启动多个引擎实例,此时Dart VM 依然是共享的,只是不同Engine 实例加载的代码运行在各自独立的Isolate 中。

2.Google 官方给出的建议

      (1)引擎深度共享

      在混合方案方面,Flutter 官方给出的建议是从长期来看,应该支持在同一个引擎支持多窗口绘制的能力, 至少在逻辑上做到FlutterViewController 共享同一个引擎的资源。换句话说,希望所有的绘制窗口共享同一个主Isolate。

      但Google 官方给出的长期建议目前来说没有很好的支持。

      (2)多引擎模式

      在混合方案中,我们解决的主要问题是如何处理交替出现的Flutter 和Native 页面。Google 工程师给出了一个Keep It Simple 的方案:对于连续的Flutter 页面(Widget),只需要在当前FlutterViewController 中打开即可,对于间隔的Flutter 页面,选择初始化新的引擎。

      例如,进行下面一组导航操作:

Flutter Page1 -> Flutter Page2 -> Native Page1 -> Flutter Page3

      只需在Flutter Page1 和Flutter Page3 中创建不同的Flutter 实例即可。

      这个方案的好处是简单易懂,逻辑清晰;但也有潜在的问题,如果一个Native 页面和一个Flutter 页面一直交替进行,那么Flutter Engine 的数量会呈线性增加,而Flutter Engine 本身是一个比较重的对象。

      (3)多引擎模式的问题

  • 冗余的资源问题。多引擎模式下,每个引擎之间的Isolate 是相互独立的。在逻辑上这并没有什么坏处,但是引擎底层其实是维护了图片缓存等比较消耗内存的对象。想象一下,若每个引擎都维护自己的一份图片缓存,则内存压力将非常大。
  • 插件注册的问题。插件依赖Messenger 传递消息,而Messenger 是由FlutterViewController ( Activity ) 实现的。如果有多个FlutterViewController,插件的注册和通信将会变得混乱、难以维护,消息传递的源头和目标也会变得不可控。
  • Flutter Widget 和Native 的页面差异化问题。Flutter 的页面是Widget,Native 的页面是VC。从逻辑上来说,我们希望消除Flutter 页面与Naitve页面的差异,否则在进行页面埋点和其他一些统一操作的时候,都会遇到额外的复杂度。
  • 增加页面之间通信的复杂度。如果所有Dart 代码都运行在同一个引擎实例中,它们共享一个Isolate,则可以用统一的编程框架进行Widget之间的通信,多引擎实例也增加复杂度。

      因此,综合多方面考虑,闲鱼并没有采用多引擎混合方案。

3.现状与思考

      考虑到多引擎存在的一些实际问题,所以闲鱼目前采用的混合方案是共享同一个引擎。这个方案基于这样一个事实:在任何时候最多只能看到一个页面,当然对于些特定的场景,可以看到多个ViewController,但是这些特殊场景我们这里不讨论。

      可以这样简单地理解这个方案:把共享的Flutter View 当成一个画布,然后用一个Native 的容器作为逻辑的页面。每次在打开一个容器的时候,通过通信机制通知Flutter View 绘制成当前的逻辑页面,然后将FlutterView 放到当前容器里面。

      老方案在Dart 侧维护了一个Navigator 栈的结构,如图1-20 所示。栈数据结构的特点是每次只能从栈顶操作页面,每一次在查找逻辑页面的时候,如果页面不在栈顶,则需要往回退栈。如此会导致中途被退栈的页面状态丢失,这个方案无法支持同时存在多个平级逻辑页面的情况,因为在切换页面的时候必须从栈顶操作,无法在保持状态的同时进行平级切换。

      举个例子:有两个页面A 和B,当前页面B 在栈顶。切换到页面A需要把页面B 从栈顶Pop 出去,此时页面B 的状态丢失,如果想切回页面B,只能重新打开,页面B 之前页面的状态无法维持住。这也是老方案最大的一个局限。

      如在Pop 的过程中,可能会把Flutter 官方的Dialog 误杀,这也是一个问题。

      而且基于栈的操作,我们依赖对Flutter 框架的一个属性修改,让这个方案具有了侵入性的特点,这是另一个问题。

20.jpg

图1-20

相关文章
|
9月前
|
传感器 人工智能 物联网
穿戴科技新风尚:智能服装设计与技术全解析
穿戴科技新风尚:智能服装设计与技术全解析
736 85
|
8月前
|
机器学习/深度学习 JSON 自然语言处理
Flutter敏感词过滤实战:基于AC自动机的高效解决方案
在社交、直播等场景中,敏感词过滤至关重要。本文介绍基于AC自动机的Flutter高效敏感词过滤方案,通过构建Trie树与失败指针实现线性时间复杂度的多模式匹配,支持干扰字符处理与动态优化。代码实战结合性能对比,助你打造毫秒级响应的过滤系统,适用于聊天、评论、内容审核等场景,保障平台安全。
430 69
|
5月前
|
前端开发 Java 开发者
SpringBoot 3 + Flutter3 实战低代码运营管理
Spring Boot 3 与 Flutter 3 强强联合,助力现代 Web 与移动应用开发。Spring Boot 3 提升后端开发效率,支持最新 Java 特性;Flutter 3 实现跨平台高性能 UI,热重载加速前端迭代。两者结合打造高效、可扩展的应用开发新体验。
249 0
|
9月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
580 27
|
9月前
|
人工智能 API 语音技术
HarmonyOS Next~鸿蒙AI功能开发:Core Speech Kit与Core Vision Kit的技术解析与实践
本文深入解析鸿蒙操作系统(HarmonyOS)中的Core Speech Kit与Core Vision Kit,探讨其在AI功能开发中的核心能力与实践方法。Core Speech Kit聚焦语音交互,提供语音识别、合成等功能,支持多场景应用;Core Vision Kit专注视觉处理,涵盖人脸检测、OCR等技术。文章还分析了两者的协同应用及生态发展趋势,展望未来AI技术与鸿蒙系统结合带来的智能交互新阶段。
600 31
|
9月前
|
编解码 监控 网络协议
RTSP协议规范与SmartMediaKit播放器技术解析
RTSP协议是实时流媒体传输的重要规范,大牛直播SDK的rtsp播放器基于此构建,具备跨平台支持、超低延迟(100-300ms)、多实例播放、高效资源利用、音视频同步等优势。它广泛应用于安防监控、远程教学等领域,提供实时录像、快照等功能,优化网络传输与解码效率,并通过事件回调机制保障稳定性。作为高性能解决方案,它推动了实时流媒体技术的发展。
503 5
|
9月前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
352 4
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术如何重塑客服系统?解析合力亿捷AI智能客服系统实践案例
本文探讨了人工智能技术在客服系统中的应用,涵盖技术架构、关键技术和优化策略。通过感知层、认知层、决策层和执行层的协同工作,结合自然语言处理、知识库构建和多模态交互技术,合力亿捷客服系统实现了智能化服务。文章还提出了用户体验优化、服务质量提升和系统性能改进的方法,并展望了未来发展方向,强调其在客户服务领域的核心价值与潜力。
546 6
|
9月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
557 3
|
9月前
|
编解码 人工智能 并行计算
基于 Megatron 的多模态大模型训练加速技术解析
Pai-Megatron-Patch 是一款由阿里云人工智能平台PAI 研发的围绕英伟达 Megatron 的大模型训练配套工具,旨在帮助开发者快速上手大模型,打通大模型相关的高效分布式训练、有监督指令微调、下游任务评估等大模型开发链路。本文以 Qwen2-VL 为例,从易用性和训练性能优化两个方面介绍基于 Megatron 构建的 Pai-Megatron-Patch 多模态大模型训练的关键技术

推荐镜像

更多
  • DNS