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

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

1.4 快速完成混合工程搭建

      Flutter 的主要开发模式分成两种,一种是独立App 的模式,以Flutter为主,原生工程会被包含在Flutter 工程下;另一种是让Flutter 以模块(Flutter 模块)的形式存在,分别集成在已有的iOS 和Android 原生应用下,原生工程可以在任何的目录结构下,和Flutter 工程地址不产生关联,并需要在原生工程结构中声明Flutter 工程的本地地址。在Flutter 能够以模块形式存在之前,闲鱼进行了很长时间的混合App 架构的探索,对原生工程进行了比较多的改动。在Flutter 官方推出Flutter 模块模式后,我们进行了大量调研,最终推出了一套开箱即用的混合工程脚手架flutter-boot,有助于快速搭建混合工程。

1.4.1 flutter-boot 简介

      flutter-boot 主要解决了混合开发模式下的两个问题:Flutter 混合开发的工程化设计和混合栈。那么flutter-boot 是如何解决的呢?

      首先在工程化设计的问题上,flutter-boot 建立了一套标准的工程创建流程和友好的交互命令。当流程执行完成后,即拥有了混合开发的标准工程结构。这一套工程结构能够帮助开发者同时拥有Flutter 开发和原生开发两种开发视角,本地Flutter 开发和云端Flutter 构建两种Flutter 集成模式,其效果如图1-19 所示。

      另外,在混合栈方面,flutter-boot 能自动注入混合栈依赖,同时将核心的混合栈接入代码封装并注入原生工程内。用户按提示插入简单的几行模板代码后,即可看到混合栈的效果。使用flutter-boot 搭建的混合工程开箱即可使用,接下来介绍flutter-boot 解决这些问题的详细过程。

19.jpg

图1-19

1.4.2 工程化设计

1.了解官方的Add Flutter to existing apps 项目

      在了解flutter-boot 的工程化设计细节之前,我们需要对Google 官方提供的Add Flutter to existing apps 方案有一个初步的了解。Add Flutter to existing apps 项目会引导开发者以模块的形式创建Flutter,模块形态的Flutter 的工程结构如下所示。

some/path/

 my_flutter/

    lib/main.dart

    .ios/

    .android/

      在官方的工程结构下,.ios 和.android 是模板工程,当在Flutter 工程目录下运行时,即通过这两个工程来启动应用。我们如何让原生工程和Flutter 产生关联呢? 这里的关联会分成三个部分, 分别是Flutter 的Framework、业务代码和插件库。其中,Flutter 插件库分成 Flutter Plugin Native(即插件原生代码)和Flutter Plugin Dart(即插件的Dart 代码)两个部分。这四部分的差异如表1-1 所示。

表1-1

191.jpg

      Flutter Framework 只需要在依赖管理中声明即可,Flutter Plugin Native可以直接以源码的方式集成,Flutter Plugin Dart 只有在被业务代码引用时才有效。和业务代码一样,需要支持Dart 代码的调试模式和发布模式。Dart 代码的关联会侵入App 的构建环节,根据App 构建的模式来决定Dart代码的构建模式。对于具体的实现,以iOS 系统为例,在podfile 文件中增加一个自定义的Ruby 脚本podfilehelper 的调用,podfilehelper 会声明Flutter Framework 的依赖、Flutter Plugin Native 的源码引用和业务代码的路径。接下来会介入构建流程,在Xcode 的build phase 内加入shell 脚本xcodebackend 的调用,xcodebackend 会根据当前构建模式产出Dart 构建产物。

2.flutter-boot 的补充

对于官方的混合工程项目,在体验过程中发现有如下问题:

  • 文件或配置的添加为手动添加,流程较长。
  • 不支持在Flutter 仓库下运行原生工程。
  • 不支持Flutter 以独立代码仓库部署时的远端机器构建。

      因此,在flutter-boot 脚手架中,为了解决这些问题,把混合工程的部署分为create、link、remotelink 和update 四个过程。

      (1)create

      create 过程在于搭建一个Flutter 模块,包括Flutter 模块的创建和Git仓库的部署。在调用Flutter 模块创建命令前,通过基础的检查,让工程位置和命名的规范满足官方条件。在部署Git 仓库时,会在gitignore 中忽略部分文件,同时对仓库的状态进行检查。当仓库为空时,直接添加文件;当仓库非空时,会优先清理仓库。

      (2)link

      link 过程在于关联本地的原生工程和Flutter 工程。在关联的过程中,会先请求获取Flutter 工程的地址和原生工程的地址,然后将需要手动集成的部分通过脚本的方式自动集成。为了获得Flutter 开发视角(即Flutter工程下运行原生工程),将原生工程进行了软链接,链接到Flutter 工程的iOS 目录和Android 目录。Flutter 在运行前会找到工程下的iOS 或Android目录然后运行。在Flutter 工程下运行iOS 工程会存在一个限制,即iOS 工程的target 需要指定为runner。为了解决这个问题,将原生工程的主target进行了复制,命名为runner 的target。同时,为了支持远程构建的模式,将Flutter 仓库本地路径的声明根据构建模式进行了区分,封装在自定义的依赖脚本中。例如在iOS 工程内,会添加fbpodhelper.rb 脚本文件,然后将Flutter 仓库本地路径添加到配置文件fbConfig.local.json 中。

      (3)remotelink && update

      在远端构建模式下,通过remotelink 能够获取Flutter 仓库的代码,并在远端机器上进行构建。在远端构建模式下,我们会侵入依赖管理的过程,在获取依赖时,拉取Flutter 仓库的代码,将代码放置在原生工程的.fbflutter目录下,并将该目录声明为Flutter 仓库本地路径。对于拉取Flutter 代码并进行本地部署的过程,我们称为update 过程。在远端构建时,就能和本地构建如出一辙。那么如何区分远端模式和本地模式呢?我们将远端的Flutter 仓库信息记录在fbConfig.json 中, 同时在gitignore 中忽略fbConfig.local.json 文件,这样只需要负责初始化混合工程的工程师运行一次remotelink,其他的开发协同者将不用关注远端构建的配置流程。

      (4)init

      为了便于快速搭建,我们提供了一个命令集合,命名为init,将必备的环节以命令行交互的模式集成在了init 命令中。

1.4.3 混合栈

      混合栈是闲鱼开源的一套用于Flutter 混合工程下协调原生页面与Flutter 页面交互的框架,目前是混合开发模式下的主流框架。在混合栈开源后,有大量开发者在集成混合栈时会遇到因各种环境配置或代码添加导致的集成问题,为此这里提供一套快速集成的方案。

1.集成问题

      要做到快速集成,面临两个问题:Flutter 和混合栈的版本兼容,混合栈Demo 代码封装及插入。

      (1)版本兼容问题

      目前支持的混合栈版本为0.1.52,支持Flutter 1.5.4。当Flutter 升级时,混合栈势必要进行适配,即集成的混合栈版本也需要变更。因此,将混合栈的版本配置通过文件进行维护,记录当前Flutter 所需要的混合栈版本。在初版的flutter-boot 中,我们限定了混合栈的版本号,在发布新版本混合栈时,将开放版本选择的功能。

      (2)代码封装及插入问题

      在调研了混合栈的使用过程后,将混合栈需要的Demo 代码分成了四个部分:Flutter 引擎的托管,页面路由的配置,Demo 形式的Dart 页面,原生的测试跳转入口。

2.解决方案

      ① Flutter 引擎的托管

      对于引擎的托管,依赖于应用的初始化。由于初始化过程随着应用的复杂而复杂,因此目前提供了一行代码作为接口,使用者在初始化应用时加入这一行代码即可完成托管。

      ② 页面路由的配置 &&Demo 形式的Dart 页面

      路由配置指路由到某个标识符时,Flutter 页面或原生页面需要识别并跳转到相应页面。路由的配置需要在原生页面和Flutter 页面两侧进行部署。在原生侧,将混合栈的Demo 路由代码进行了精简,然后将其添加到原生工程的固定目录下。由于iOS 仅添加代码文件是不会被纳入构建范围的,因此封装了一套iOS 侧的代码添加工具来实现文件的插入。在Flutter侧,对main.dart 文件进行了覆盖,将带有路由逻辑的main.dart 集成进来,同时提供了Demo 形成的Dart 页面的创建逻辑。

      ③ 原生的测试跳转入口

      为了方便使用者快速看到混合工程的跳转模式,在iOS 和Android 双端封装了一个入口按钮和按钮的添加过程,使用者在测试页面手动加入一行代码,即可看到跳转Flutter 的入口。

3.最终效果

      在使用flutter-boot 前,开发者可能要花费数天来进行混合工程搭建。现在,开发者只需要调用一个命令,加入两行代码即可完成混合工程的搭建,大大降低了开发成本。但flutter-boot 的使命还未达成,我们期望开发者能更加流畅地进行Flutter 开发,未来会优化多人协同的开发流程,完善持续集成环境的搭建,让开发者拥有更佳的开发体验。

相关文章
|
8天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
47 13
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
65 10
|
4天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
148 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
3天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
31 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
17天前
|
数据采集 DataWorks 搜索推荐
阿里云DataWorks深度评测:实战视角下的全方位解析
在数字化转型的大潮中,高效的数据处理与分析成为企业竞争的关键。本文深入评测阿里云DataWorks,从用户画像分析最佳实践、产品体验、与竞品对比及Data Studio公测体验等多角度,全面解析其功能优势与优化空间,为企业提供宝贵参考。
93 13
|
7天前
|
容器
Flutter Widget 解析
Flutter Widget 解析
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
秒级响应 + 99.9%准确率:法律行业文本比对技术解析
本工具基于先进AI技术,采用自然语言处理和语义匹配算法,支持PDF、Word等格式,实现法律文本的智能化比对。具备高精度语义匹配、多格式兼容、高性能架构及智能化标注与可视化等特点,有效解决文本复杂性和法规更新难题,提升法律行业工作效率。
|
13天前
|
数据采集 存储 JavaScript
网页爬虫技术全解析:从基础到实战
在信息爆炸的时代,网页爬虫作为数据采集的重要工具,已成为数据科学家、研究人员和开发者不可或缺的技术。本文全面解析网页爬虫的基础概念、工作原理、技术栈与工具,以及实战案例,探讨其合法性与道德问题,分享爬虫设计与实现的详细步骤,介绍优化与维护的方法,应对反爬虫机制、动态内容加载等挑战,旨在帮助读者深入理解并合理运用网页爬虫技术。
|
19天前
|
机器学习/深度学习 自然语言处理 监控
智能客服系统集成技术解析和价值点梳理
在 2024 年的智能客服系统领域,合力亿捷等服务商凭借其卓越的技术实力引领潮流,它们均积极应用最新的大模型技术,推动智能客服的进步。
54 7
|
20天前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。

推荐镜像

更多