如何提高架构的稳定性、可扩展性和易用性等能力?点击看大咖分享 了解详情
写点什么

Flutter Fish Redux 架构演进 2.0

  • 2021 年 5 月 27 日
  • 本文字数:3067 字

    阅读完需:约 10 分钟

Flutter Fish Redux架构演进2.0

Fish-Redux 开源以来,已经在闲鱼核心链路上做了大量验证。从初期的宝贝详情页,发布页面开始,Fish-Redux 在闲鱼的使用程度逐渐提高。Fish-Redux 框架的使用极大提升了复杂页面场景下的开发效率。特别是通过框架提供的组件复用和状态管理能力,我们大幅降低了代码冗余也简化了页面复杂度。

然而随着页面复杂度的不断提升,现有能力已无法支撑新业务场景的述求。特别是


  • 页面编排

  • 动态 AB

  • 灵活性不足


于是我们基于 Fish-Redux 现有框架做了新一轮架构演进。通过对现有适配器能力的升级,进一步提高了架构的灵活性。Fish-Redux 的 2.0 版本正式诞生!

闲鱼 Fish-Redux 现状

Fish-Redux 已经在闲鱼核心链路大量落地。Fish-Redux 核心收益如下:

  1. 组件复用

    以闲鱼的商品详情页开发为例。以核心的服务类型商品和交易类型商品为基础。借助 Fish-Redux 框架,我们衍生出了普通宝贝,租赁宝贝,玩家号宝贝等 10 多个宝贝详情页面。这些不同类型的详情页面,不仅有自己独立的业务模块,也最大可能的复用了共同的组件模块。

  2. 状态管理

    在发布这种强交互场景开发中,我们使用 Fish-Redux 高效管理了大量的页面事件,极大提升了组件通信的效率。繁多的业务场景下也保证得了逻辑组件化。

  3. 代码结构管理

    Fish-Redux 为我们提供了很好的文件代码规范。这保证我们在开发的时候,无论是代码风格还是项目结构,都有着高度一致性。发布链路我们多人参与开发,负责对应的模块,针对对应的组件部分进行开发。特别是人员流转以后,可以快速上手,这极大的提高了多人协同开发的效率。

Fish-Redux 面临的挑战

需要保持 Fish-Redux 的特性前提下暴露出动态编排能力的 Adpater,满足上诉能力才能支撑为未来所需要的业务场景。

简单介绍下目前 adapter 所存在的一些短板和不足:

已有静态编排:StaticFlowAdapter

StaticFlowAdapter({    @required List<Dependent<T>> slots,    Reducer<T> reducer,    Effect<T> effect,    ReducerFilter<T> filter,  })
(Dependent = connector + component)
复制代码


FlowAdapter 由 Dependent 数组决定页面展现顺序。页面的展示顺序直接取决于 solts,并且能直接控制各个自组件之间的数据流转,利用这一点优势去编写复杂页面,各种数据分治的逻辑,很大程度的提高来代码的可维护性。这种形式也存在某些弊端,我们无法对 slots 动态的进行修改,缺失动态编排能力。


null

已有动态编排:DynamicFlowAdapter

    final Map<String, AbstractLogic<Object>> pool;  final AbstractConnector<T, List<ItemBean>> connector;
DynamicFlowAdapter({ @required this.pool, @required this.connector, ReducerFilter<T> filter, Reducer<T> reducer, Effect<T> effect, @deprecated Object Function(T) key, })
复制代码


DynamicFlowAdapter 提供的核心入参是“pool”,“connector”。pool 提供的 adapter 的组件池,connector 提供组件 key,state。从列表组件静态展示转变为数据源动态控制页面列表 UI。多组件,重复展示的列表提供来便利。


DynamicFlowAdapter 也存在一些不便的地方,所有的组件数据处理都归一到了一个 connector 之中,Fish-Redux 数据分治的亮点就难以得到体现。对于我们去编写复杂动态页面列表也不是很方便。


null

无论是 StaticFlowAdapter 还是 DynamicFlowAdapter 都无法同时满足动态编排加上数据分治的特性,我们对 Fish-Redux 做了进一步的演进。

Fish-Redux 演进

第一个版本是基于 Fish-Redux 的能力我们做了一层脚手架 effective_redux,针对我们上诉的需求对于 DynamicFlowAdapter 进行包装(组件注册+数据源处理)完成了 data 映射 component 逻辑,实现了对应的动态编排能力。

  1. 脚手架中内置了一些了通用基础模版,动态模版,列表模版等,来支持一些紧急的业务需求。

  2. 对 fish redux 做了 ListAdapter 功能增强,提出了 Section 的概念。来满足对数据不同数据集合类型展示的需求


但是做完第一个版本后引发了一些思考:

  1. 动态编排能力是否使用 fish redux 的用户也需要

  2. 针对页面改动修改了页面框架的外观是否增加学习成本,开发人员的不习惯

  3. 技术带动业务发展,业务需求是否能反补技术框架能力等


第二个版本我们决定将部分能力反补至 fish redux 中。经过一些思考和目前存在的 Adapter 一些功能实现对比,总结了目前我们能反补到 fish redux 的能力部分。并且统一化了 FlowAdapter,同时提供了动态编排的能力。

改进后的编排:FlowAdapter

Dependent = connector(数据描述)+component(UI 描述配置)

重新思考了 Adapter 的核心思想:Dependent 集合的中转站,处理集合内的数据流转,组件的刷新逻辑。同时将处理后的集合转换成 UI 界面特定数据。


null


动态编排实现:FlowAdapater 不再以静态的形式获取组合的 Dependent 列表,由静态参数 List 转变为 FlowDependencies 获取的动态回调。我们可以在 FlowDependencies 中做一系列扩展,例如页面展示动态编排,组件的 AB 功能等等。


分治数据特性:动态获取的 List 为 connector+component 的数据集合,不再是单一的做数据映射 UI 的逻辑处理,将真正的数据处理过程交回到各个 connector 中,保持了 adapter 内组件的数据处理分治特性。


null


null


当然我们也做了 adapter 的规整。上诉介绍的两种 adapter 其实我们会发现内部的实现逻辑是保持不一致的,static adapter, dynamic adapter 真正去处理组件集合的拉平逻辑是不同的。

针对这种我们把 StaticFlowAdapter,DynamicFlowAdapter 功能实现迁移至我们的新版 FlowAdapter 中。保证 Adapter 能力实现一致,外观保持一致,降低学习成本,也能统一做一些性能上的优化。


null


null

效果展示

fish redux 完成架构升级后,我们的详情 &发布链路做了对应的代码修改。


null


null


内置模版注册,根据服务端下发的配置信息决定页面的编排顺序。基于框架提供出对应的动态编排能力,我们能做到我们提出的一些业务可能性。


【动态编排能力】我们的编排顺序,展示数据是由服务端返回的配置信息数据决定的。也就是说页面的展示是有服务端确定的。我们后续对模块之间的顺序调整不再依赖于客户端本地修改后进行发包修改。同时我们也做了对应数据一场的兜底方案,标准的页面展示顺序。


【组件 AB 能力】组件 AB 的能力可以交付到服务端前置处理,同时也可以本地代码中增加动态替换的代码,根据不同的配置分桶做一些定制化的处理。


【动态模版】动态模版的增加为了满足产品快速验证某个业务模块是否可行,直接线上做测试校验,不需要客户端发版本。


详情的效果展示:基于价格模块的位置调整,上下架进行了一些尝试。我们能很快的进行一些线上调整动作。


展望

这次我们针对 fish redux 的 adapter 做规整,对于编排数据获取的思路转变,更加明确了 adapter 的功能职责。在根本之处对 adapter 做了优化处理,更加适应业务场景。此次的优化修改后续会合并至 fish redux release 之中,为大家带来更多的使用便捷之处。


基于这次框架的演进,为我们带来了 fish redux 针对不同容器下更多的思考,我们不单单只满足于普通列表的 adapter 适配,fish redux 针对不同容器展示,我们也在着手准备。对于瀑布流场景或者其他的容器内也能有很好的落地。也会在 fish redux 层面做出一些对 PowerScrollView 的适配。


对于一些业务的解决方案,动态模版,AB 能力我也期望输出到 fish redux 的扩展包中,不单单解决框架层面的一些问题,最终是一个框架平台的形式让使用者更加简易。对 fish redux 的能力扩展也是我们后续的一个重要命题。


最后,欢迎大家积极尝试 fish redux,并在社区中发出声音,提出问题或者改进建议,以及贡献代码。我们相信未来 fish redux 会在更多的场景,能力上使用出现在屏幕上,让大家感受到 fish redux 的美妙之处。


本文转载自:阿里巴巴中间件(ID:Aliware_2018)

原文链接:Flutter Fish Redux架构演进2.0

2021 年 5 月 27 日 11:40721

评论

发布
暂无评论
发现更多内容

财经大课:运用现代经济学分析中国经济的关键常识

石云升

学习笔记 财经思维 11月日更

用得上的 JavaScript 代码片段和技巧

devpoint

JavaScript LocalStorage reduce 11月日更

10种黑客类型,你知道几种?

喀拉峻

黑客思维 黑客 网络安全 信息安全

架构实战训练营 - 毕业结语

NewBranSTONE

「架构实战营」

linux之我常用的20条命令(之二)

入门小站

Linux

Android端信号处理总结

轻口味

android 音视频 11月日更

这都是什么

冇先生

拥抱时序数据库,构筑IoT时代下智慧康养数据存储底座

华为云开发者联盟

数据 IoT 时序数据库 华为云 智慧康养

netty系列之:搭建客户端使用http1.1的方式连接http2服务器

程序那些事

Java Netty 程序那些事 http2 11月日更

MatrixDB 4.3 发布:持续聚集等6大特性解读!

yMatrix

数据库 时序数据库 分布式时序数据库

数字化转型浪潮滚滚 区块链造就可信“数字经济底座”

CECBC

双十一来袭,阿里技术官终于把高并发系统设计整理成册了(全彩版开源)

Sakura

Java 架构 面试 后端 高并发

架构训练营毕业总结

老实人Honey

毕业总结

脉动

CSS架构之Acss层(中)

Augus

CSS 11月日更

IDEA免费激活至2099年教程,亲测可用

Tom弹架构

Java 工具 IDEA

制度密码经济学:了解区块链的经济影响

CECBC

算法的本质是什么?程序员如何学好算法?

Sakura

Java 架构 面试 算法

《重学Java高并发》手写生产者消费者模型

中间件兴趣圈

高并发 java; 11月日更

在线文本纵向排版工具

入门小站

工具

架构实战营 毕业总结

一雄

架构实战营 毕业总结

老板再也不用担心我不会K8s了,哪里不会点哪里,15个开放学习K8s的网址

奔着腾讯去

运维 云原生 Docker Desktop k8s资源 Go 语言

【设计模式】第九篇 - 适配器模式 - 你多大鞋,我多大脚

Brave

设计模式 适配器模式 11月日更

软件工程师的专业素养解读

卢卡多多

11月日更

重新认识 nginx 反向代理

liuzhen007

11月日更

架构实战营毕业总结

xyu

架构实战营

2021全屋智能为何依然进展缓慢?

脑极体

防抖&节流

达摩

js 防抖 节流

架构实战营 - 模块七作业

en

#架构实战营

“芯”有灵“蜥” 走进 Intel MeetUp

“芯”有灵“蜥” 走进 Intel MeetUp

Flutter Fish Redux架构演进2.0_架构_阿里巴巴中间件_InfoQ精选文章