Flutter Fish_Redux 3.0起航!

简介: fish_redux新篇章,更具有生命力3.0版本扬帆起航,一起探究精简且具有想象力的fish_redux。

作者:闲鱼技术——啊丘

序言

fish_redux 2.0 FlowAdapter 功能优化,整体业务落地后,我们着手fish_redux新一轮的优化与架构演进。fish_redux 3.x 版本最终的目标保持fish_redux的“生命力”,在框架的易用性,可扩展,核心能力部分做到可持续发展。本文分为三大主题,3.0版本首轮优化部分,架构的思考,后续fish_redux可持续输出部分。

fish_redux 3.0.1

关于涉及应用开发领域,相信绝大多数同学都听过或多或少了解MVC模型。MVC 是一个架构的描述,它有不少变种,如MVP, MVVM等但本质上这些都属于MVC的范畴。MVC的定义或解释,不同的语言/领域/框架,又有不同的解释。MVC模式(Model–View–Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

当 视图(View)从传统的直接操作GUI对象 变为声明式UI/响应式UI。
会带来两个巨大的变化(MVVM变种):
1)视图(View)层,对开发者,抹去了GUI的中间状态,复杂度进一步降低
2)MVC的之间的结构关系得到简化和解耦,模型(Model)和控制器(Controller)不再依赖视图(View)。

易用性和可维护性,往往是两个层面的考虑:

  • 易用性是对过往的归纳总结;
  • 可维护性是对场景需求的进一步的抽象演绎;

那么以fish_redux为例:

  • State定义 & Reducer函数 对应 Model层
  • Effect函数对应Controller层
  • View函数对应View层

fish_redux3.0目的是解决由于客户端/前端应用层软件墒快速上升, 提升软件可维护性, 提高团队协作效率。
客户端/前端 应用层软件复杂度快速上升,它的原因可能有这些:

  1. 项目中缺少应用架构, 将完全无法应对需求迭代和人员迭代的变化。
  2. 应用架构和现实需求的不匹配, 导致应用架构无法起到有效的隔离复用的作用, 甚至成为一种阻碍。
  3. 开发者的认知设计水平差异, 没有达成团队内有效的共识

应用框架是应用架构的一种具体的代码实现,以上几点是fish_redux产生和演进的主要动机。
而当下fish_redux3.0的阶段性目标:

  1. 收到大家的反馈, 需要提升易用性
  2. 提高软件的可维护性, 有传承和延续性。
  3. 试图去整合覆盖更多的闲鱼内场景, 形成应用框架的统一编程范式

fish_redux3.0.1版本第一步,提升fish_redux的易用性,可维护性。因此核心能力的概念精简,整体实现代码的瘦身是我们的首要目标。fish_redux2.0版本代码量在3k+行,经过这次的精简后整体代码保持在1k行左右。接下来分三个纬度来介绍概念是如何精简。

1.核心能力

fish_redux结合了Redux的状态管理特点, 产生的基于状态驱动&组装式组件化&函数式&高性能的应用框架。

状态驱动
在现代化的UI库中, 都是响应式, 状态驱动的。更进一步,在fish_redux中, 驱动UI是自动的。只要状态变化,组件就会得到刷新。
从分层视角看: 第一层状态管理层, 负责了状态的集中化管理, 向上提供了单一数据源下的组件化/状态的读写和变更订阅的能力. Middleware是设计用来做这一层的切面扩展能力.

组装式组件化
在fish_redux中, 对组件和组件之间的关系, 做了全新的定义,目的是

  1. 构建高度隔离的业务代码.
  2. 在隔离的基础上, 提供了业务组件的复用单元.
  3. 将组件与组件之间的依赖关系, 显式声明. 在众多类型的详情/发布场景中, 提高了业务编排可读性可维护性可扩展性.

函数式
将组件内的业务代码, 通过抽象, 将业务代码划分为View/Reducer/Effect三个角色.
每一角色负责单一职责. 每一单一职责都有每一确定的函数签名来约束.

上诉核心能力梳理后,明确了各个功能层的核心类以及API。在状态管理我们保留了基础能力部分以及切面能力。
Redux:Store/Connector/DispatchBus/Action
切面能力:MiddleWare
我们做到了最小代码两情况下支持Redux框架能正常work,状态驱动能力得到完美实现。

组件部分(Component):View/Reducer/Effect/Context 组成。

优化前:
image.png

优化后:
image.png

显而易见的是我们去除了redux_aop/redux_routes/redux_component_mixin等部分能力,这样子做的目的是这一部分的能力非fish_redux的核心能力,是一些基于redux做的一些能力扩展,在fish_redux增加部分代码徒增概念,使用者的理解成本会加大。
同时redux_middleware,redux_connector合并至redux之中,redux_adapter合并至redux_component之中。

2.层级收拢

fish_redux2.0实现Component引出了许多功能相近,差异度较低的抽象类,Component/Logic/AbstractLogic/AbstractComponent等。同时Adapter的实现在此基础上更为复杂,Adapter/AbstractAdapter/AbstractAdapterBuilder/Logic/AbstractLogic/AbstractComponent。如此层级下去阅读实现,调试等成本是巨大的。因此我们对组件层的实现做到的了层级收拢,减少多余的概念,保留了BasicComponent/Component/Adapter。

优化前:
abstract class Component<T> extends Logic<T> implements AbstractComponent<T> {
 .....
}

abstract class Logic<T> implements AbstractLogic<T> {
 ......
}

abstract class AbstractComponent<T> implements AbstractLogic<T> {
 .......
}

abstract class AbstractLogic<T> {
....
}

优化后:

class Component<T> extends BasicComponent<T> {
 ...
}
Class Adapter<T> extends BasicComponent<T> {
 ...
}
abstract class BasicComponent<T> {
 .....
}

同时我们对Context部分也做了相同的优化,上下文(Context)针对任何组件是相同的概念与实现。同时针对View接收Context保持了统一实现。原有Context部分:
ComponentContext/LogicContext/ContextSys/Context/ViewService
AdapterContext/LogicContext/ContextSys/Context/ViewService
多层级实现继承在调试和概念理解也是有一定难度,对于这一部分的重构和减少层级部分我们也做出了变化。

fish_redux2.0:

class AdapterContext<T> extends LogicContext<T> {
}

class ComponentContext<T> extends LogicContext<T> {
}

abstract class LogicContext<T> extends ContextSys<T> with _ExtraMixin {
}

abstract class ContextSys<T> extends Context<T> implements ViewService {
}

abstract class Context<T> extends AutoDispose implements ExtraData {
}

abstract class ViewService implements ExtraData {
}

fish_redux3.0:

abstract class ComponentContext<T> {
}

class ComponentContextImp<T> extends ComponentContext<T> {
}

我们规范了Context只管理Component组件节点的上下文管理,对于虚拟组件,普通组件保持相同实现无差异化。Context目前负责Component的生命周期,消息发送,以及缓存等功能,同时保存了store已经BuildContext部分。对于代码实现上一眼就能明白Context的能力实现,十分清晰。

3.扩展能力

扩展能力部分抽离,保持核心可扩展能力。View/Effect/Connector 等功能部件部分,我们做了一系列的扩展,方便使用等核心能力。考虑到对于这些功能为非核心功能部分,不同使用者存在不同看法,同时统一app落地存在不同使用的方式。因此我们针对这些能力移动到后续fish_redux的扩展包中。
扩展能力部分的想法来自于Adapter的演进,Adpater的前身有许多功能性Adapter变种,DynamicFlowAdapter, StaticFlowAdapter等使用与不同列表的拉平功能。其核心能力归结于FlowAdapter的Dependents的描述,试想针对这一类的变种是会源源不断,不同场景实现也不相同。对于扩展包收拢该“实现”,基于fish_redux核心能力适应于不同场景的“变种功能”。
扩展包的想象力与趣味性还是很足的。针对View/Effect/Connector/Adapter等我们已经有很好的构思,扩展包也在持续输出中。

总结

fish_redux2.0精简版本至3.0部分,整体代码量由3k+减少到目前的1k左右。在不断的优化核心能力部分,相信更加简便的实现和代码优化会不断的输出。我们列举了目前规划的Action,在近期我们会不断投入并且实现的部分。

  1. 3.0 版本的release,和扩展能力包输出并且release。同时也会对2.0版本适配DartSDK 2.x的适配。
  2. 虚拟组件如何更优雅的实现,生命周期如何更合理化,虚拟组件如何更巧妙的嵌入。
  3. Flutter侧应用框架,对于不同业务类型的业务容器的支持。(目前支持ListView容器)

同时定制更长远的计划,不断的像大家输出更好的fish_redux。3.x的目标提升框架的“生命力”,是为了让更多的开发者参与到fish_redux的使用和建设中,不断的完善改进,保持与Flutter的共同发展。所以在核心实现层的代码精简,扩展能力层的输出是让开发者从运用层面,实现部分都能进来讨论并且进入开发。只有这样子可持续的发展进步才能让更好的应用框架被开发者们使用,挖掘。我们也希望我们能在Github上做一些更多的讨论,共同在Flutter侧的Redux应用框架作出贡献。fish_redux3.0-beta版本很快会与各位见面。

相关文章
|
2月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
26天前
|
开发框架 Dart 前端开发
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。本文从 Flutter 简介、特点、开发环境搭建、应用架构、组件详解、路由管理、状态管理、与原生代码交互、性能优化、应用发布与部署及未来趋势等方面,全面解析 Flutter 技术,助你掌握这一前沿开发工具。
56 8
|
26天前
|
存储 JavaScript 前端开发
在Flutter开发中,状态管理至关重要。随着应用复杂度的提升,有效管理状态成为挑战
在Flutter开发中,状态管理至关重要。随着应用复杂度的提升,有效管理状态成为挑战。本文介绍了几种常用的状态管理框架,如Provider和Redux,分析了它们的基本原理、优缺点及适用场景,并提供了选择框架的建议和使用实例,旨在帮助开发者提高开发效率和应用性能。
34 4
|
26天前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
39 2
|
2月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
103 3
|
1月前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
228 0
|
1月前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
78 0
|
2月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
91 7
|
2月前
|
编解码 Dart API
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
112 0