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

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

1.2.3 方案的制定

1.两种模式

      首先将Native 工程处于独立目录环境下称为Standalone 模式,处于Flutter 目录下称为Flutter 模式。纯Native 开发或平台打包就处于Standalone模式,Flutter 对开发人员和打包平台来说是透明的,不会影响构建与调试。而Flutter 的代码则在Flutter 模式下进行开发,其相关库的生成、编译和调试都执行Flutter 定义的流程,如图1-13 所示。

10.jpg

图1-13 两种工程模式

2.厘清依赖

      从模式的定义来看,既然改造的核心就是把Standalone 模式提取出来,那么就要厘清Standalone 模式对Flutter 的依赖,并将其提取成第三方的库、资源或源码文件。以iOS 为例,通过阅读Flutter 构建的源码,可知Xcode工程对Flutter 有如下依赖:

      1)App.framework:Dart 业务源码相关文件。

      2)Flutter.framework:Flutter 引擎库文件。

      3)pubs 插件目录及用于索引的文件:Flutter 下的插件,包括各种系统的插件和自定义的channels(桥接通道)

      4)flutter_assets:Flutter 依赖的静态资源,如字体和图片等。

3.依赖引入的策略

      在改造过程中,闲鱼尝试过两种依赖引入策略,下面分别进行阐述。

(1)本地依赖。通过修改Flutter 构建流程,将其库文件、源码和资源直接放置到Native 工程的子目录中进行引用,以iOS 为例,就是将Flutter.framework 及相关插件等做成本地的Pod 依赖,也将资源复制到本地进行维护。由此,Standalone 模式便具备了独立构建和执行的能力,对于纯Native 开发人员来说,Flutter 只是一些二方库与资源的合集,无须关注。而在Flutter 模式下,Dart 源码的构建流程不变,不影响编译和调试。同时,由于是本地依赖,在Flutter 模式下的各种改动也可以实时地同步到Native 工程的子目录中。提交修改后,Standalone 模式也就拥有了最新的Flutter 相关功能。

      优点:将Flutter 相关内容的改动同步到Standalone 模式也比较方便;

      缺点:需要对Flutter 原有的构造流程进行稍复杂的改动,并且与后续的Flutter 代码合并会有冲突,且Native 工程与Flutter 的代码、库及资源等内容还是耦合在本地,不够独立。

      (2)远程依赖。远程依赖的想法是将Flutter 所有依赖内容都放在独立的远端仓库中,在Standalone 模式下引用远程仓库中的相关资源、源码和库文件,在Flutter 模式下的构建流程和引用方式不变,如图1-14 所示。

优点:对Flutter 自身的构建流程改动较少,较彻底地解决了本地耦合的问题。

 缺点:同步的流程变得更烦琐,Flutter 内容的变动需要先同步到远程仓库后再同步到Standalone 模式方能生效。

14.jpg

图1-14

1.2.4 改造的实现过程

1.目录的组织

      在Flutter 模式下,父工程目录下的iOS 和Android 的子目录分别包含对应的Native 工程。在代码管理上,子工程可以使用Git 的Submodule 形式,保证目录间的独立。

2.远程依赖的实现

      在Standalone 模式下,Flutter 的依赖内容都指向远程仓库中的对应文件,而在Flutter 模式下依赖的方式不变。

      (1)向Standalone 模式同步Flutter 的变更。由于远程依赖的问题是同步变动比较麻烦,为此闲鱼开发了一系列脚本工具,使该过程尽量自动完成。假设Flutter 的内容(可能是业务源码、引擎库或某些资源文件)发生变化,那么在Flutter 模式下构建结束后,脚本会提取生成好的所有依赖文件并将其复制到远程仓库,提交并打标签,然后依据打出的标签生成新的远程依赖说明(如iOS 下的podspec 文件),最后在Standalone 模式下将Flutter 的依赖修改至最新的版本,从而完成整个同步过程,如图1-15 所示。

15.jpg

图1-15

      (2)同步的时机

      建议在提测及灰度期间,每次Flutter 业务的提交都能够触发同步脚本的执行和App 打包;在开发期间,保持每日一次的同步即可。

      为解决引入Flutter 后的工程适配问题,闲鱼抽取了Flutter 的相关依赖放到远程供纯Native 工程进行引用,从而保证了Flutter 与纯Native 开发的相互独立与并行执行。

      该方案已在闲鱼施行了几个版本,并反向输出给了Flutter 团队,为其后续的hybrid 工程组织计划提供了方向和参考。同时,相信该方案也可以为转型Flutter 的团队提供帮助,虽然项目间的差异也会导致方案的不同,但是实施的思路依然有借鉴价值。

相关文章
|
12天前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
38 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
12天前
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
29 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
15天前
|
自然语言处理 编译器 Linux
|
17天前
|
消息中间件 编解码 开发者
深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
本文深入探讨了 Flutter 在屏幕适配、横竖屏切换及多屏协作方面的兼容架构。介绍了 Flutter 的响应式布局、逻辑像素、方向感知、LayoutBuilder 等工具,以及如何通过 StreamBuilder 和 Provider 实现多屏数据同步。结合实际应用场景,如移动办公和教育应用,展示了 Flutter 的强大功能和灵活性。
86 6
|
17天前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
61 3
|
17天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
99 1
|
10天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
14天前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
32 0
|
17天前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
112 0
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2

推荐镜像

更多