首页 > 编程知识 正文

flutter技术分享,ureport2二次开发

时间:2023-05-05 13:58:38 阅读:59948 作者:1685

业务逻辑组件(bloc )设计模式是一个新鲜的词汇,提出于2018年1月的DartConf,其实是在Rx系列思想下发展起来的响应型编程模式。

PS :从后端研发的角度来看,前端领域的一些想法确实很大胆。

其核心是将变量的变化视为一种流,将小部件的状态与流联系起来,从而在变量变化时小部件接收并响应事件而变化。 因此,BLoC可以完全封装业务逻辑,而小部件只需输入、输出和逻辑模块交互即可完全解耦。

让我们偷拍一下BLoC的结构:

BLoC的具体实现这里的实现的90%来自这个知道的大人物的文章。 你去看:

在Flutter中使用Bloc处理数据和更新UI

Stream的概念可以将Stream视为管道,其中事件从一端输入,接收端从另一端获取事件,并相应地改变事件。 此处的小部件必须用于流构建器。

在Flutter中,StreamController管理流程以controller.sink为入口,以controller.stream为出口

在基本的BLoC实现中,假设需要一个表示开/关的环境变量,并且App与此变量相关联的交换机控件具有多个页面。 无论哪个页面移动交换机,都必须匹配与其他页面对应的交换机的状态。

这里可以设想的输入事件有两种。

变量值发生变化- -开关状态发生变化用户移动开关- -因为值发生变化,所以有两个流:值流和用户操作事件流

classappswitchbloc { bool _ switch value=false; streamcontrollerbool _ appswitchcontroller=stream controler (; //用于值更改事件的输入(私有变量,未发现) streamsinkboolget _ in switch=_ appswitchcontroller.sink; //用于值更改事件的输入(暴露值输出) streamboolgetoutswitchvalue=_ appswitchcontroller.stream; 流控制器_ switchactioncontroller=流控制器(; //用户输入触发器(streamsinkgetchangeswitchvalue=_ switchactioncontroller.sink; AppSwitchBLoC ()//指定_handleEvent函数处理用户输入事件_ switchaction controller.stream.listen ) _handleEvent ); }_handleevent(data )//业务处理逻辑,其中_switchValue的值是用户输入的值_switchValue=data; //将用户输入的值传递给值Stream,以触发接口元素小部件转换_inswitch.add(switchvalue )。 } } BLoC的状态管理此代码来源于上述已知的大人物。 请大家自己理解代码…

abstractclassblocbase { void dispose (; } classblocprovidertextendsblocbaseextendsstatefulwidget { finaltbloc; final构件池; blocprovider(keykey,@required this.child,@required this.bloc,} ) : super (key : key ); @ override _ blocproviderstatetcreatestate (=new _ blocproviderstatet ); static Type _typeOfT ()=T; statictoftextendsblocbase (buildcontextcontext ) { final type=_ typeofblocprovidert }; blocprovidertprovider=context.ancestorwidgetofexacttype (type; 返回提供程序. bloc; } class _ blocproviderstatetextendsstateblocproviderblocbase { @ overridevoiddispose (} {构件. bloc.dispose ); super.dispose (; } @ overridewidgetbuild (buildcontextcontext ) { return widget.child; }在此基础上,上面的AppSwitchBLoC为:

classappswitchblocimplementsblocbase//添加无源代码更改dispose方法@overridevoiddispose((//stream资源释放_ appswitchcontrorom }接口和BLoC的结合使用上面的提供程序即可

首先进入AppSwitch页面时,原本只需要进入Page实例,但现在需要在Provider中封装图层。

//改造前的navigator.of(context ).push (newmaterialpageroute ) builder : (context ) { return AppSwitchPage; (); //改造后navigator.of(context ).push ) newmaterialpageroute ) builder: ) context ) returnblocproviderappswitchpage () 此时,可以在AppSwitchPage页面上获取BLoC实例

classappswitchpageextendsstatefulwidget { @ override _ appswitchpagestatecreatestate (=_ appswitchpagestate ); } class _ appswitchpagestateextendsstateappswitchpage { @ overridewidgetbuild (buildcontextcontext ) finalappswitchblocblock retbuild derbool ) stream:bloc.outswitchvalue,initialData: false, builder3360 ) contialdata 3360 asyncsnapshotboolsnapshot (返回交换机(onchange : ) value )//这里是用户操作后的开关值bloc.change 、//这里是从流中监听值变化的value: snapshot.data; (); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。