UI2CODE再进化!结合Redux的框架升级!

背景

UI2CODE的目标是通过分析视觉稿得到对应的代码,让AI提高开发效率。然而过去静态化页面的产出,不能得到业务场景的需求。针对于此,我们以UI2CODE自动化开发为基底,结合Redux的消息机制,将自动化生成的维度提升到页面的处理。

透过框架,可自动化生成页面代码,并且具有数据驱动展示、消息派送等动态性能力。期望在复杂的业务场景下,简化开发的工作。并且在使用一致化的架构下,避免未来业务代码耦合严重,使代码分工明确,容易修改维护。

进化后的UI2CODE?

开发者可以透过Intellij Plugin分析视觉稿后会生成对应的视图代码,以及和此页面框架结合的能力。

在整体开发的定位上我们的野心是,提供一套可扩充的页面消息框架,并且自动生成大部分的UI代码。目标带来以下的好处:

  1. 快速建构新应用,框架将完成大部分的事,业务开发同学只要专注于业务代码
  2. 让开发人员的进入门槛降低,在我们落地的经验中,后端同学只要有基本的概念,无需花费太多经历,可直接上手帮忙写代码
  3. 让页面的架构统一化,让页面的开发有统一的规则,也方便后续的维护
  4. 提供通用的组件库,可重复利用

核心设计思路

我们在设计上主要参考于MVP、CLEAN、VIPER以及FISH_REDUX等框架。目的在实践高聚合低耦合的前提下,分拆为视图组装层、视图展示层、数据层、事件交互层。层层分离职责,不互相干扰,又可互相通讯。

分层拆开的好处为容易维护,并且可以单元测试"业务展示"以及"业务逻辑",框架上清晰,容易有一个统一的遵循规则,达到简单编写重复可利用。

UI2CODE页面框架的设计概念为,主要分为Page、Card、Reaction三大元素。在上层的Page负责组装页面,制定页面的风格。Card则为可重复利用的视图展示元素。Reaction则为事件反应的监听。

在整个页面框架上,可以透过UI2CODE Plugin分析自动化生成业务UI,产生出Page、Card、Card(DataModel)。仅需修改Card上额外的业务展示,以及撰写Reaction中的业务逻辑。

具体实现架构

在介绍框架组件前,先理解UI2CODE的基本组成页面目录如下:

以Page为单位,页面本体demo_page为其他页面路由调用的起点,透过设置Config.dart决定内部含的卡片列表以及事件处理列表,组合出Card以及Reaction的关联。

其详细的架构关系如下:

Page

Page为框架基础的单位,为单一页面,负责决定视图的组装以及页面的样式(Template)。

在Page之内可包含若干的Card以及Reaction,分别为视图的展示以及视图的事件处理。可以很清晰地将业务场景做分割成小模块,不互相影响。

Abstract class PageStatelessWidget extends StatelessWidget

implements Lifecycle

  • 可由UI2CODE Plugin自动化产生
  • 框架统一分发管理页面生命周期Lifecycle
  • 透过设定Template指定页面要呈现的样版,或者修改如背景等属性
  • 透过设定Config指定这个页面含有的Cards和Reactions
  • 透过设定PageState可添加额外的数据

Page Template

Template样板为页面的抽象化,在整体页面上分为多个样板可选择。并且支持设置AppBar(非必选)、Header(非必选)、Body、Stack(非必选)等子样板。

样板可比喻为页面的容器,目前支持以下样板,并且可扩充:

  1. PageTemplate,通用页面容器,并支持NestedScrollView的Silver Header滚动(若需要)
  2. PageBottomNavigatorTemplate,含有底部导航的容器,如首页
  3. PageSwitchTabTemplate,含有分页Tab功能的容器

各个子样板也有相对应的Template可选择,如在Body内的样板功能为决定内部Cards排列的方式。举例来说,BodyListViewTemplate则是列表展示。

使用Template最大的好处为减少开发工作,可直接使用封装后的接口。并且页面内的所有样板将共用消息机制,可以互相传递消息,如Body内部的卡片很容易发送消息给AppBar等。这是框架上的有力之处。

Page Config

Config决定页面的组装,包含了元件有哪些,以及事件处理反射的类绑定。

Extends PageConfig

  • 可由UI2CODE Plugin自动化产生
  • 透过设定cards注册这个页面所载入的卡片
  • 透过设定actions注册这个页面所响应的类,支持卡片事件以及页面事件
  • 支持额外设置AppBar、Header、Stack等组件(非必须)

如何绑定,举例来说:

void actionConfig(List< List < Function>> actions) {
//卡片Card8575, 响应事件的类为Card8575Reaction
actions.add(< Function>[() => Card8575, () => new Card8575Reaction()]);

}

Card

Card代表基本的视图展示,业务UI,其中包含了View widget以及DataModel数据。框架内会将两者Data binding起来,由数据来驱动最终展示的呈现。达到如MVP中View和ViewModel的隔离效果。

Abstract class BaseCard<T extends DataModel> extends StatefulWidget

  • 可由UI2CODE Plugin分析视觉稿产生
  • 透过BaseCard<T extends DataModel>的标准化,指定数据DataModel绑定
  • Card可以发出事件,不直接操控数据,而让接收者响应

Reaction

Reaction代表著事件发生的响应,可以选择是否处理事件。若选择处理,可同步或异步修改对应的数据DataModel。

Abstract class CardReaction<S, D extends DataModel>

  • init()为初始化事件,自动发出,可进行一些初始动作
  • RegisterReactions()注册感兴趣的事件handler
  • 可于handler上加上aysnc,指定为异步处理
  • Reaction内依据事件修改DataModel,只要关注事件改变后的数据,本身不持有数据,视图将会自动刷新

举例来说:

 

//如发送rAssignPrice的事件
doAction(Card6736Event.rAssignPrice);

//接收rAssignPrice的事件, 并对数据做处理
@override
Map

 

 Card6736Event.rAssignPrice: (PageItemBean state, CardAction action, Card6736DataModel data) {//修改数据栏位data.userName = "123";},

};
}

结合Redux

在页面框架的背后,我们采用了Redux来进行封装。

Redux是一套的数据管理的框架。所有的数据的储存于Store的State内。当事件发生时,会发生不同的Action,根据事件响应不同的Reducer去改变State。若经过响应后State有所变化,则绑定的视图会视需要做对应的刷新。

我们应用了Redux中等State、Action、Reducer、Store、Middleware的概念,将页面赋予生命状态,而页面内的组件间可支持消息机制。Redux对刚入门的同学还是有一定的门槛所在,但在本框架的封装下,基本上感觉不到Redux的存在。

消息机制

在UI2CODE消息框架下,页面内的各个组件以及容器都可以弹性的进行消息传递。可以由Page、Card、Reaction等处任意的发送消息,达到(自身、兄弟间、子对父、父对子)的通知。

各种消息传递的路径说明如下:

自身:Card发出的消息将由自身定义的Reaction处理

兄弟间:Reaction内可选择转发,可以指定转发的对象为另外一张Card

父对子:可于Page内指定发送的Card

子对父: 若发出的消息在Card内无人处理,则会冒泡到Page层级处理

总结进化的UI2CODE

  • 框架简单,只需了解框架基本的元素,不需要会Redux就可以达到数据管理的效果。目前闲鱼内部的新应用落地,所有的页面均透过框架的机制来达到消息传递。而其中1/3页面UI为透过自动化生成,减少了约一半的整体开发时间。
  • 因为组件的分层解耦,维护时可以清晰看到页面的组成及覆用代码。并且在修改组件时,不影响到其他组件的作用。
  • 事件可以在页面框架下自由的传递,达到高聚合的效果,并且响应支持同步和异步的流程。开发者只需要关心数据处理,视图的刷新将会由框架处理。

未来展望

透过整合UI2CODE Plugin,使用插件可透过AI自动分析产生Page、Config、Card等。开发者可以在自动化的基础上再进行修改,大大减少从无到有的开发时间。我们期望开发者只需要专注的修改业务展示以及业务逻辑,不需要对页面设置做过多的处理。

透过与业务上的合作,我们获得了很多实际上的想法,以及对于不同业务场景的适应。在这些经验上不断地优化框架,让框架更解耦,支持能力更多。未来我们希望是不只闲鱼内部的应用,也扩展给更多的应用!


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8080:The Tomcat connector configured to listen on port 8080 failed to start 的解决办法

问题再现&#xff1a; 控制台最后会显示Application启动失败&#xff0c;如下&#xff1a; ...*************************** APPLICATION FAILED TO START ***************************Description:The Tomcat connector configured to listen on port 8080 failed to start. …

数据库连接池的原理没你想得这么复杂

来源 | 犀牛饲养员的技术笔记封图| CSDN 下载于视觉中国背景介绍数据库连接池和线程池等池技术存在的意义都是为了解决资源的重复利用问题。在计算机里&#xff0c;创建一个新的资源往往开销是非常大的。而池技术可以统一分配&#xff0c;管理某一类资源&#xff0c;它允许我们…

CICD联动阿里云容器服务Kubernetes实践之Bamboo篇

本文档以构建一个 Java 软件项目并部署到 阿里云容器服务的Kubernetes集群 为例说明如何使用 Bamboo在阿里云Kubernetes服务上运行Remote Agents并在agents上运行Build Plans。 1. 源码项目 本示例中创建的GitHub源码项目地址为&#xff1a; https://github.com/AliyunConta…

拔掉数据库的电源会怎样?阿里云数据库新型灾备架构,让云端容灾有“备”无患

拔掉数据库的电源会怎样&#xff1f; 假设我们拔掉数据库的电源会怎样&#xff1f; 在日前举行的阿里云“企业级”云灾备解决方案发布会上&#xff0c;阿里云智能技术战略总监陈绪就来了一场现场“断电”演示&#xff0c;拔掉了数据库的电源。 &#xff08;直播回放&#xf…

高可用 kubernetes 集群部署实践

前言 Kubernetes&#xff08;k8s&#xff09; 凭借着其优良的架构&#xff0c;灵活的扩展能力&#xff0c;丰富的应用编排模型&#xff0c;成为了容器编排领域的事实标准。越来越多的企业拥抱这一趋势&#xff0c;选择 k8s 作为容器化应用的基础设施&#xff0c;逐渐将自己的核…

还不知道 AWS 是什么?这 11 个重点带你认识 AWS !

作者 | Sajan Agrawal译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国云计算的出现使软件行业受益匪浅。大多数公司已经改变了策略&#xff0c;将现有的项目转移到云上&#xff0c;并在此基础上构建新的项目。今天&#xff0c;让我们了解一个名为亚马逊网络服务云&…

KeeperErrorCode = Unimplemented for /test

使用Curator时报错&#xff0c;原因是因为版本问题 zookeeper版本&#xff1a;zookeeper-3.4.8 cuartor版本&#xff1a;3.2.0 看Curator官网的声明&#xff1a; 地址&#xff1a;http://curator.apache.org/ The are currently two released versions of Curator, 2.x.x and 3…

Java-用户交互Scanner

next方式 public class Demo01 {public static void main(String[] args) {// 创建一个 扫描器对象&#xff0c;用于接收键盘数据Scanner scanner new Scanner(System.in);System.out.println("使用next 方式接收&#xff1a;");// 判断用户有没有输入字符串if (sc…

【ECS最佳实践】基于多块云盘构建LVM逻辑卷

一、LVM简介 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。 LVM最大的特点就是可以对磁盘进行…

剧情反转:今年AI要凉!薪资碾压全行,但人才缺500万!

最近关于AI有两个消息&#xff0c;一个好的&#xff0c;一个坏的。先说好消息。德勤发布《全球人工智能发展白皮书》&#xff0c;预计到2025年&#xff0c;世界人工智能市场规模将超过6万亿美元&#xff01;2017年至2025年复合增长率达30%。毫无疑问&#xff0c;目前AI还是一个…

maven 报错一站式解决方案

文章目录一、本地maven玩耍三部曲1. 先确认项目引用默认的maven配置是否正确2. 查看IntelliJ IDEA查看maven配置是否正确3. 重新导入maven依赖二、本地maven报错5步走2.1. 配置maven阿里云仓库2.2. 删除本地仓库中不完整的jar2.3. 连接外网2.4. 在线下载依赖2.5. 重新导入maven…

如果测试没有梦想,那跟咸鱼有什么区别?

软件质量不是测出来的&#xff0c;但为什么又有这么多测试工程师为了质量而工作&#xff1f;测试是一个成本部门&#xff0c;测试创造的价值是什么&#xff1f;研发的模式在不断地变化&#xff0c;测试的定位如何不断去定义&#xff0c;未来的测试又会是什么形态&#xff1f;今…

使用阿里云极速型NAS构建高可用的GitLab

使用阿里云文件存储NAS构建GitLab高可用环境 GitLab简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得…

The following SDK components were not installed: extra-google-m2repository and platform-tools

安装android studio到最后一步的时候遇见了这个问题 。 android studio安装详见Android Studio 安装 经过查阅多篇博客 把他们的解决方案放在一起一顿操作猛如虎&#xff0c;然后就成了。。。 2篇原文链接我放在这里&#xff1a; Android Studio新建工程时SDK缺少extra-an…

数据库中间件漫谈——看看云时代,它会走向何方

来源 | 阿丸笔记封图| CSDN 下载于视觉中国前言随着业务的发展&#xff0c;MySQL数据库中的表会越来越多&#xff0c;表中的数据量也会越来越大&#xff0c;相应地&#xff0c;数据操作的开销也会越来越大&#xff1b;另外&#xff0c;无论怎样升级硬件资源&#xff0c;单台服务…

即插即用,基于阿里云Ganos快速构建云上开源GIS方案

对于轻量级GIS应用&#xff0c;选择具备时空能力的云上数据库再搭配开源GIS软件&#xff0c;能够快速构建稳定、廉价、实用的GIS解决方案。Ganos是阿里云自研时空基础设施&#xff08;PaaS层&#xff09;的核心引擎&#xff0c;该引擎整合了云上异构计算并行加速、OSS大规模存储…

Knative 初体验:Serving Hello World

通过前面两章的学习你已经掌握了很多 Knative 的理论知识&#xff0c;基于这些知识你应该对 Knative 是谁、它来自哪里以及它要做什么有了一定的认识。可是即便如此你可能还是会有一种犹抱琵琶半遮面&#xff0c;看不清真容的感觉&#xff0c;这就好比红娘拿姑娘的 100 张生活照…

Java-if选择结构

if单选择结构 if双选择结构 if多选择结构 嵌套if结构 https://www.bilibili.com/video/BV12J41137hu?p36&spm_id_frompageDriver

数据仓库介绍与实时数仓案例

1.数据仓库简介 数据仓库是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrate&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time Variant&#xff09;的数据集合&#xff0c;用于支持管理决策…

优酷背后的大数据秘密

在本文中优酷数据中台的数据技术专家门德亮分享了优酷从Hadoop迁移到阿里云MaxCompute后对业务及平台的价值。 本文内容根据演讲视频以及PPT整理而成。 大家好&#xff0c;我是门德亮&#xff0c;现在在优酷数据中台做数据相关的事情。很荣幸&#xff0c;我正好见证了优酷从没…