当前位置:首页 > 闲鱼技术 > 正文内容

Flutter React编程范式实践

xianyu3年前 (2021-03-06)闲鱼技术275

作者:闲鱼技术-匠修
Flutter Widget的设计灵感来源于React,是一款原生就立足于响应式的UI框架。本文基于Flutter特点,试图结合闲鱼在Flutter的工程应用来谈下我们对Flutter React编程范式的思考和践行。

微信号:pps688888
添加微信, 免费测试软件
复制微信号

Reactive的诞生

谈起UI总会讲到MVC,它出现的时间很早,那时候还没有普及现代GUI广泛使用的事件驱动(消息循环)模型,所以很长的时间内,MVC都在进化,不断的被重新定义。到现在MVC已经是一个很宽泛的概念了。使用基础的MVC作为框架来开发容易出现模块职责边界模糊,逻辑调用方向混乱。GUI框架进化后,将用户事件的分发处理集成到了View模块中,由此出现了MVP,MVP职责划分较清晰,逻辑调用方向也比较好把握,但是很繁琐,开发效率不高。再随着Web的发展,标记语言被应用于界面描述,开始出现逻辑界面分离和无状态化界面,MVVM应运而生。MVVM让架构层面来提供数据和View的双向绑定,减轻了开发工作,但有时候也带来了一定程度的状态混乱。函数式编程在近年被重新提起,并引发潮流,催生了响应式界面开发,响应式是对GUI事件驱动模型的一种返璞归真。

archs

个人对前端架构迭代的理解:

从迭代历程上看,Model和View是两个相对固定的角色,它们容易理解,也能很好的确定职责边界。如何去沟通Model和View是架构设计的关键,响应式的一般做法是让Model回到最初的事件驱动,结合函数式的数据流来驱动View刷新。这样有比较清晰的角色划分和简单易于理解的逻辑链接,能较好的统一编程模式。

reactive

Flutter的Reactive特性

通常GUI框架都有一些共同点,比如View的树形层级,消息循环,Vsync信号刷新等,Flutter也继承这些经典的设计,但是Flutter并没有使用标记语言来描述界面(例如Web中的HTML,Android中的XML),这其中有Flutter立足于响应式的初衷。Reactive是一款将事件数据流作为核心的开发模型,UI框架会提供相应的特性来提供更好的支持。

1.描述界面而不要操作界面

dataflow

有一种说法认为函数式语言和命令式语言的不同在于命令式语言是给计算机下达指令而函数式语言是向计算机描述逻辑。这种思路在Flutter UI中得到了体现。Flutter不提倡去操作UI,它当然也基本不会提供操作View的API,比如我们常见的类似TextView.setText(),Button.setOnClick()这种是不会有的。对界面的描述是可以数据化的(类似XML,JSON等),而对界面的操作是很难数据化的,这很重要,响应式需要方便可持续的将数据映射成界面。

在Flutter中用Widget来描述界面,Widget只是View的“配置信息”,编写的时候利用Dart语言一些声明式特性来得到类似结构化标记语言的可读性。不论Stateless Widget 还是 Stateful Widget都是不可变的(immutable),其中的成员变量也应该都是final的,也就是说,Widget是“只读”的。Widget是数据的映射,当数据改变的时候,我们需要重新创建Widget去更新界面,这意味着Widget会创建销毁的非常频繁,不过Flutter使用的Dart虚拟机能高效的处理这种短周期的轻量对象。

framework

这种设计思路对刚接触的开发者可能有些不习惯,我们可以借助开发Android中的ListView(iOS中的TableView)来理解:我们通常先准备好一个数据List,然后实现一个Adapter来将List中的items映射成一个个itemView,最后将List和Adapter设置给ListView。这样当我们改变List中的数据,ListView就会相应的刷新View。Flutter类似,我们准备好Widgets(只不过Widget的“容器”是Tree而不是List),Flutter会提供Adapter(RenderObjectToWidgetAdapter)将其映射成渲染用的RenderObject,当Widget更新时就会刷新界面。

另外,Widget也能通过设置Key来缓存复用,在类似ListView的场景中,Item Widget的复用是很有收益的。

2.基于共同祖先通信

在我们国家,如果你想和别人沟通上拉近距离,有时候会进入到类似“我们500年前是一家”的这种语境中。在Flutter中,如果两个组件要通信,也是去找祖先(当然,也有可能两个组件本身就有遗传关系),Flutter把它描述成“数据上行,通知下行”。

comm

但是,在一个非常复杂的树形层级中,要找到某位“祖先”并不是很容易的事情,而且性能也不好。Flutter为此做了优化,提供了InheritedWidget,“祖先”Widget继承该类型后,child可以通过BuildContext中提供的inheritFromWidgetOfExactType方法方便的找到在层级中离的最近的那位“祖先”。该方法做了优化,效率很高,并且可以让child和“祖先”建立依赖关系,方便做刷新。

Flutter中并没有提倡类似controller的概念(像Android中的Activity,iOS中的ViewController),本身View是不可操作的,controller也就失去了意义。那么,组件之间的通信就必须在View层“自力更生”了。

3.函数式数据流

这肯定不是Flutter才有的,要想把响应式实现的简洁优雅,就要利用好语言的函数式特性。Flutter的亮点是它使用的Dart语言能把这件事情变的很轻量,你基本不需要引入什么第三方库就能做到(不过确实有RxDart库,但感觉只是做了额外的增强),而且明显语言Api的设计也往这个方向上做了优化,非常方便。具体可以看看Stream和RxDart。

基于React的框架实践

统一状态管理和单向数据流

redux

通过React的实践,响应式可以很好的解决数据到界面的更新,而且效率也不错。但是自身对数据状态的管理不足,React官方提出了Flux,而在面对复杂业务场景时,Flutter官方也是推荐Redux架构,我们也是根据这一思路搭建的框架。

首先是业务逻辑和界面分离,界面是无状态(Stateless)的,我们也正在尝试自动化的方法直接生成界面代码,所以Widget中是不会有业务逻辑代码的。当我们把一个能描述当前界面的数据(State)交给View层时,界面就应该能正常展示。用户和界面交互会产生Action,Action代表了用户交互的意图,Action可以携带信息(比如用户使用输入留言,Action中就应该携带用户留言的内容信息)。Action会输入给Store,Store会通过注册的Interrupters对Action做前期拦截处理,可以通过Interrupter截拦Action,也可以把一个Action重新改写成另外的Action。Store然后收集相应绑定的Reducers对Action做一次reduce操作,产生新的State,并通知界面刷新。

通常我们在创建Store的时候就组册好Reducer和Interrupter:

Reducer中就是处理用户交互时产生的Action的逻辑代码,接收3个参数,一个是执行上下文,一个要处理的Action,一个是当前的State,处理结束后必须返回新的State。函数式理想的Reducer应该是一个无副作用的纯函数,显然我们不应该在Reducer中去访问或者改变全局域的变量,但有时候我们会对前面的计算结果有依赖,这时可以将一些运行时数据寄存在ReduceContext中。Reducer中不应该有异步逻辑,因为Store做Reduce操作是同步的,产生新State后会立即通知界面刷新,而异步产生对State的更新并不会触发刷新。

Interrupter形式上和Reducer类似,不同的是里面可以做异步的逻辑处理,比如网络请求就应该放在Interrupter中实现。

*为什么会有Interrupter呢?换一个角度,我们可以把整个Store看成一个函数,输入是Action,输出的是State。函数会有副作用,有时我们输入参数并不一定得会相应有输出,比如日志函数( void log(String) ),我们输入String只会在标准输出上打印一个字符串,log函数不会有返回值。同样,对Store来说,也不是所有的Action都要去改变State,用户有时候触发Action只要想让手机震动下而已,并不会触发界面更新。所以,Interrupter就是Store用来处理副作用的。

通常我们会让一个界面根部的InheritedWidget来持有Store,这样界面上的任何Widget
都能方便的访问到Store,并和Store建立联系。这种做法可以参考redux_demo,再此不详细展开。

最后简单的说说Store的实现,Store能够接收Action,然后执行reduce,最后向widget提供数据源。Widget可以基于提供的数据源建立数据流,响应数据变更来刷新界面。这其中最核心的就是Dart的Stream。

Store中最核心的对Action进行reduce操作:

Widget基于Store暴露的数据源建立数据流:

组件化的扩展

我们在业务开发中发现,有时候一个页面一个Store会带来组件复用上的不方便,比如视频播放组件是一个逻辑比较内聚的组件,如果把它的reducer都集中放在页面的Store中那么别的页面想要复用这个开发好的视频组件就不方便了,这时候视频组件可能需要一个独立的Store来存放视频播放相关的逻辑。我们遵循Flutter组件通信方法,将框架扩展为允许存在多个Store,并且做到对Widget开发无感知。

compontent

Widget只能感知离它最近的Store持有者,该Store会向更高层级Store转发Action,同时接收来自更高层级Store的数据变更并通知Widget。

延展讨论

相对目前流行的MVVM框架(Vue,Angular)能够细粒度的绑定数据,并实现界面的最小化刷新,Flutter上面还没有找到很好的办法能够在框架内自动实现,目前只能依赖开发者去手动处理。这不免会降低开发效率,拉低开发体验,我们也在探索更好的方法,如果感兴趣或者有好的解决思路,欢迎和我们交流。

当遇到状态复杂页面(多动画,多view联动)时,Store中应该要提供相关工具或机制来管理复杂的状态来提高开发效率,状态机是个可选的方案之一。如果有在Dart下优雅的状态机框架实现或思路,请务必和我们分享一下。

最后,闲鱼技术团队广招各类方向的达人,无论你是精通移动端,前端,后台,还是机器学习,音视频,自动化测试等,都欢迎投递简历加入我们,一同用技术改善生活!

<

扫描二维码推送至手机访问。

版权声明:本文由中客网络发布,如需转载请注明出处。

本文链接:http://www.zzzmc.cc/21.html

分享给朋友:

相关文章

都有哪些功能呢?

都有哪些功能呢?

  说起闲鱼,就不得不提闲鱼助手,顾名思义,闲鱼助手作用就是为闲鱼服务的,但是我们很多其他小伙伴都不可以知道闲鱼助手的具体分析功能需求是什么,那么对于今天小编就来给大家通过说一说,闲鱼助手的具体管理功能有哪些?一起发展来看一看吧!   首先,在商品管理方面,小钱吉先宇助理支持多商品一键批量采集,这意味着我们不需要逐个选择,节省了我们很多时间。 并为我们的最大利益支持20多个国内外供应平台。   另一方面,在发射时,支持全国定位发射,也就是说,免费的鱼类助理支持在全国任何地方发射,我们都知道发射定位的位置,在很大程度上,决定了我们的交通和曝光,选择一些用户更多的一线和二线城市,对我们...

稳定提升闲鱼权重的方法有哪些?

稳定提升闲鱼权重的方法有哪些?

  【闲鱼流量】稳定提升闲鱼权重的方法有哪些?      2020年08月26日   闲鱼流量   82 views   0   一:稳定宝贝数量。   在闲鱼上卖东西的很多卖家一开始就急不可耐,一口气上架了非常多的宝贝。其实,上架的宝贝过多的话,账号容易被官方判定为商业账号,所以一定不要一口气上架过多的宝贝。   那么应该如何上架呢?   每隔几个小时上架一个宝贝,每天上架2到3个。在上架全新宝贝的同时,可以上架几个自己的二手宝贝。   这样会显得你像一个业余卖家,就算闲鱼官方检测你的账号,闲鱼官方也不会因此隐形降权。   二...

闲鱼上架软件,批量操作新手必备

闲鱼上架软件,批量操作新手必备

  【闲鱼排名】闲鱼上架软件,批量操作新手必备      2020年12月25日   闲鱼排名   55 views   0   闲鱼是处置闲置物品的好地方,也是电商运营很值得操作的一个平台,这里的用户群很多,只要懂得运营技巧,就能在这里赚到钱。要想在闲鱼上拥有更多的用户和流量,产品就不能少,对于新手来说,产品上架是一个大问题,这个时候就可以利用闲鱼批量上架软件来进行店群操作。   批量软件使用有什么条件?只要单账号试运营的时候没有出现什么问题,那么就可以使用批量上架软件。批量软件的条件很简单,最为重要的是批量软件的选择。新手运营闲鱼的时候,可以先去了...

怎么提高?专业技术更有保障

怎么提高?专业技术更有保障

  线上销售已经是一种形式,只不过线上销售在竞争上也很大,如今线上平台有很多。不管在那个线上平台经营都需要确保流量,有了流量才能确保销售量,在众多的线上销售平台上闲鱼的知名度越来越高,这个平台在经营中逐渐的积累了经验和人气,这也给不少卖家带来了更好的平台,卖家入住闲鱼同样需要获得流量,那么闲鱼流量该怎么提高呢?   提高闲鱼流量才能提高店铺的排名,因此在具体的操作方法上是很重要,想要提高流量首先就要打造更好的店铺效果,店铺的吸引力是很重要的,能吸引到更多的客流量,自然店铺的流量也就能上去,而提高闲鱼流量就要在店铺上下功夫,如果个人在装修店铺的时候没有很好的主意,不妨可以选择专业的平台来完...

在闲鱼卖东西有保障吗,卖家怎么维护自己的权益?

在闲鱼卖东西有保障吗,卖家怎么维护自己的权益?

  【闲鱼批量上架软件】回答当然是肯定的,毋庸置疑,闲鱼作为阿里巴巴旗下的二手交易平台,安全性自然是没话说,第一,闲鱼和淘宝都是一个网络平台,有支付宝担保交易,第二,闲鱼是淘宝二手的一个说句话的二手交易市场,不仅仅支持各种同城以及线上的担【闲鱼批量上架软件】保交易,更安全。   但是我们在运营交易时也要注意甄别买家,首先买家分很多种,第一有可能是真实的买家,他想还价,拍下不付款给你还价,让你修改价格,这样的话,你如果感觉他有诚意,价钱也能够接受就可以修改,他会拍下并付款,第二,有可能是闲鱼里面的“托”,并不想真的买你的东西,只是为了刷单或者其他目的,一般会在你发布之后很快拍下,并不付款,...

怎样在闲鱼上挣钱呢?

怎样在闲鱼上挣钱呢?

  很多人问闲鱼上怎么赚钱,这个小编就比较有话语权啦。因为我原来在闲鱼上也小赚了一笔。对于闲鱼上怎么赚钱?有一些经验可以分享给大家。   其实闲鱼上赚钱也就三个部分吧。   第一就是首先要拥有一个芝麻信用分高的闲鱼账号。   第二就是你的宝贝一定要吸引人。   第三个就是有一个非常让人舒心的交流。   如果你掌握这三个步骤,你的订单哗哗的就来了。   首先第一个。你如果自己的支付宝账号信用分高的话,你完全用你自己的支付宝账号去注册一个闲鱼号。   第二个就是你进货渠道的问题。你可以在一些批发网上或者是在一些你比较知道的批发市场去批发一些东西在网上去售卖...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。