f l u t e r e a c t编程范式的实践

频道:闲鱼技术 日期: 浏览:500
作者:自由鱼技术-工匠修复

微信号:ccjun91
添加微信群,试用软件
复制微信号

e、u、t和t的设计基于e、t和t的原始设计,其灵感来源于e、t和t的原始设计。本文从f lutter的特点出发,结合f lutter中空闲鱼的工程应用,探讨f lutter r e ac t编程范式的思考与实践。

在谈论你的时候,总是提到MVC。它出现得很早。当时,现代GUI广泛使用的事件驱动(消息周期)模型还没有普及,所以MVC在很长一段时间内不断演变和重新定义。迄今为止,MVC是一个非常宽泛的概念。使用基本mvc作为开发框架容易出现模块职责边界模糊和逻辑调用方向混乱的问题。在gui框架演化之后,用户事件的分布和处理被集成到VIEW模块中,从而产生了MVP。MVP的职责分工明确,逻辑调用的方向容易把握,但非常繁琐,开发效率不高。随着Web的发展,标记语言被应用于接口描述,逻辑接口分离和无状态接口开始出现。m v m应运而生。MVM允许体系结构级别在数据和VIEW之间提供双向绑定,这减少了开发工作,但有时会带来一定程度的状态混乱。近年来,函数式编程再次被提出,并引发了一种趋势,催生了响应式接口的发展。响应是对gui事件驱动模型本质的回归。

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

从迭代过程的角度来看,model和view是两个相对固定的角色。它们易于理解,并且能够很好地确定责任边界。建筑设计的关键是如何沟通模型和设计思想。响应的一般方法是让m模型返回到原始的事件驱动,并结合功能数据流驱动v idew刷新。这样就有了相对清晰的角色和简单易懂的逻辑链接,可以更好地统一编程模式。

一般来说,gui框架有一些共同点,例如VIEW的树级、消息循环、VSY nc信号刷新等。f l u t e r也继承了这些经典设计,但f l u t e r不使用标记语言来描述接口(例如w e b中的h t m l,n d r o i d中的x m l),其中,f l u t e r基于响应的原始意图。r e a c t i v e是一种以事件数据流为核心的开发模型。ui框架将提供相应的功能以提供更好的支持。

有一种说法是,函数式语言和命令式语言的区别在于,命令式语言向计算机发出指令,而函数式语言向计算机描述逻辑。这一思想体现在f l u t e r u i中。f l u t e r并不提倡操作UI,当然它基本上也不提供用于操作v i e w的PI,例如t e x t v i w s e t x t(),b u t o n。setonclick()将不存在。接口的描述可以数字化(类似于x、ml、j、s、o、n等),而界面的操作很难数字化,这一点非常重要。响应需要方便且可持续地将数据映射到接口中。

在f l u t e r中,w i d g e t用于描述接口。w i d g e t只是v i e w的“配置信息”。在编写时,d a r t语言的一些声明性功能被用来获得与结构化标记语言类似的可读性。无论是s t a t e e s w i d g e t还是s t e f u l w i d g e t都是不可变的(i m u t a b l e),成员变量也应该是f i n a l,也就是说,w i d g e t是“只读的”。w i d g e t是数据的映射。当数据发生变化时,我们需要重新创建WIDGET来更新接口,这意味着WIDGET将被频繁创建和销毁。然而,f l u t e r使用的d a r t虚函数可以有效地处理这种短期的轻量级对象。

这种设计理念可能不适用于刚刚接触的开发人员。我们可以通过在n d r o i d中开发lsi t v i w(i o s中的t a b e v i w)来理解它:我们通常先准备一个数据lsi t,然后实施一个p t e r,将lsi t中的i t e m映射到i t e v i w,最后,l i t和a d a p t e r设置为l i s t v i w。这样,当我们更改LI t中的数据时,LI t v e w将相应地刷新v i e w。与f l u t e r类似,我们准备了w i d g e t s(除了w i d g e t的“容器”是t r e而不是l i s t),f l u t e r将提供一个d a p t e r(r e n d e r o b j e c t o w i d g e t a d p t r),以将其映射到r i d e r o b j e c t以进行渲染,并且当w i d g e t e t e t e t更新时,界面将被刷新。

dntf,473nm规范d g e t也可以通过设置k e yrrm1缓存物种形成wdm-pon,类似的z-准大脑规范ρt assr规范e 473nm场景,规范t e m 473nm规范d g e t wdm-pon非常赚钱

在我们国家,如果你想与他人更亲近,有时你会进入一个类似“50年前我们是一家人”的环境。在FL u t e r中,如果两个组件想要通信,它们也在寻找它们的祖先(当然,这两个组件本身也可能有遗传关系),FL u t e r将其描述为“数据上行链路和通知下行链路”。

然而,在一个非常复杂的树级别上,很难找到一个“祖先”,性能也不好。f l u t e r经过优化,以提供i n h r i t w i d g t。在“祖先”继承了这种类型后,CHHLD可以通过BUL d c o n t e x t中提供的i n h r i t f r o m w i d f e x a c t y p e方法轻松找到层次结构中最近的“祖先”。该方法优化效率高,可以在CHILD和“祖先”之间建立依赖关系,便于刷新。

f l u t e r不提倡类似于c o n t r o e r的概念(例如n d r o i d中的c t i t y和i o s中的v i e w c o r)。VIEW不可操作,c o t r l e r失去其意义。然后,组件之间的通信必须在VIEW层“自立”。

这当然不是f l u t e r独有的。为了实现简单和优雅的回应,我们必须充分利用语言的功能特性。f l u t r的亮点在于,它使用的d a r t语言可以使这个问题变得非常轻量级。你基本上不需要引入任何第三方库来实现这一点(但是有r x d a r t库,但它感觉它只是得到了增强)。此外,很明显,语言api的设计也朝着这个方向进行了优化,这非常方便。有关详细信息,请参见s t r e a m和r x d a r t。

通过r e a c t的实践,该响应可以很好地解决数据到接口的更新问题,而且效率也很高。然而,由于缺乏数据状态管理,r e a c t官员提出了f l u x,f l u t t e r官员也建议在面对复杂业务场景时采用r e d u x体系结构。我们还基于这个想法构建了一个框架。

第一个是业务逻辑和接口的分离。接口是无状态的。我们还试图通过自动方法直接生成接口代码,所以小部件中不会有业务逻辑代码。当我们向VIEW层提供一个可以描述当前界面的数据时,界面应该正常显示。用户和界面之间的交互将产生一个。c t o n代表用户交互的意图。c t i o n可以携带信息(例如,如果用户使用输入消息,则用户消息的内容信息应该携带在c t i o n中)。一个c t i o n将被输入到s t o r e,s t o r e将通过已注册的i t e r截获一个c t i o n。可以通过路由器截获一个密码,也可以将一个密码改写成另一个密码。然后,s t o e收集相应的绑定r e u c e r s,对c t i o n执行r e d u c e操作,生成新的s t a t e,并通知接口刷新。

通常,当我们创建s t o e时,我们会设置r e d u c e r和i n t e r p e r:

r e d u c e r是在用户交互过程中生成的c t i o n的逻辑代码。它接收三个参数,一个是执行上下文,一个是要处理的a c t i o n,另一个是当前的s t a t e。处理后,必须返回一个新的序列号。

 

函数式的理想r e d u c e r应该是没有副作用的纯函数。显然,我们不应该访问或更改r e d u c e r中的局部变量,但有时我们会依赖以前的计算结果。此时,我们可以在r e d u c o n t e x t中注册一些运行时数据。r e d u c e r中不应存在异步逻辑,因为s t o r e的r e d u c e操作是同步的,并且在生成新s t a e后会立即通知接口刷新,而异步生成的s t a e的更新不会触发刷新。

除了异步逻辑处理可以在其中完成之外,i-t-u-p-e-r在形式上与r-e-d-u-c-e-r类似。例如,网络请求应该在IP中实现。

*为什么的有我n引线erup引线er?从另角,我们可以采伐的整个other引线大澳re的的功能.的输入的的c引线我大澳n的的输出的other引线的引线e.功能可以的一边影响.有时我们输入参数你不未必的相应输出.的例如,的日志功能(葡萄大澳我d枸杞大澳g(other引线r我ng)),时我们输入other引线r我ng,我们将只有打印的字符串的的标准输出,的的枸杞大澳g功能将不的的重返价值.品系,的other引线大澳re,不所有的c引线我大澳n的的变化other引线的引线e.用户有时扳机的c引线我大澳n,的长的他们想的摇的手机手机,他们将不扳机的接口更新.因此,我n引线erup引线er的什么other引线大澳re的用于的内幕交易的一边影响.

通常,我们会让接口根上的i n h e r i t d w i d g e t保持s t o r e,以便接口上的任何w i d g e t

可以轻松访问门店并与门店建立联系。这种做法可以参考r e d u x d e m o,我在这里不作详细介绍。

最后简单的实现,ρt alpp r e能够接收apha c t规范的alpp n,然后fief r e d u e e,最后473nm规范的d g e t提供同方。473nm规范的d g e t可以基于提供同方沟壑cernet,zn2数据sicutibus刷新ciii。这个cd59最核心的是d apha r t p t P r e apha m

s t o r e的核心是在c t o n上执行r e d u c e操作:

w i d g e t根据s t o r e公开的数据源建立数据流:

在业务开发中,我们发现有时一个页面上的一个操作会给组件重用带来不便。例如,视频播放组件是逻辑上内聚的组件。如果其研发集中在页面的前端,则其他页面将不方便重用开发的视频组件,此时,视频组件可能需要独立的前端来存储与视频播放相关的逻辑。我们遵循f l u t e r组件的通信方法,扩展框架以允许多个s t o r e的存在,并且没有感觉到w i d g e t的发展。

w i d g e t只能感知离它最近的s t o r的持有者。系统将向更高级别的系统转发数据,接收来自更高级别的系统的数据更改,并通知w i d g e t。

与目前流行的MVM框架(vue,An g u l a r)相比,它可以以细粒度绑定数据并最小化接口刷新,没有很好的方法在框架中自动实现。目前,它只能依靠开发者手动处理。这将不可避免地降低开发效率,减少开发经验。我们也在探索更好的方法。如果您有兴趣或有好的解决方案,欢迎与我们联系。

当遇到具有复杂状态(多动画、多视频链接)的页面时,系统应提供相关工具或机制来管理复杂状态,以提高开发效率。状态机是可选方案之一。如果您对DART下的状态机框架有一个优雅的实现或想法,请务必与我们分享。

最后,休闲鱼科技团队从各个方向招募人才。无论你是否精通移动终端、前端、后台、机器学习、音频和视频、自动化测试等,欢迎您发送简历,加入我们,用科技改善您的生活!

没有供应的闲置鱼类的做法是什么?如何做到这一点?游手好闲的鱼没有货源。闲置市场规模超过万亿。二手电子商务迎来了循环经济的红利。“校园圈”真的能成为游鱼生长的第二个引擎吗?如果闲置的鱼被恶意退回怎么办?开店时如何提高闲置鱼的暴露率?

关键词:闲鱼科闲鱼
复制成功

微信号: ccjun91
添加微信群,试用软件

我知道了
添加微信

微信号: ccjun91
添加微信群,试用软件

一键复制加过了
18749471747
微信号:ccjun91添加微信
ccjun91