fish_redux使用详解---看完就会用! (14)

写完连接器后,我们在Page里面绑定下,就能使用Component了

class CompPage extends Page<CompState, Map<String, dynamic>> { CompPage() : super( initState: initState, reducer: buildReducer(), view: buildView, dependencies: Dependencies<CompState>( adapter: null, slots: <String, Dependent<CompState>>{ //绑定Component "leftArea": LeftAreaConnector() + AreaComponent(), "rightArea": RightAreaConnector() + AreaComponent(), }), middleware: <Middleware<CompState>>[], ); }

view

使用Component就非常简单了:viewService.buildComponent("xxxxxx")

Widget buildView(CompState state, Dispatch dispatch, ViewService viewService) { return Container( color: Colors.white, child: Column( children: [ ///Component组件部分 Expanded( flex: 3, child: Row( children: [ Expanded(child: viewService.buildComponent("leftArea")), Expanded(child: viewService.buildComponent("rightArea")), ], ), ), ///按钮 Expanded( flex: 1, child: Center( child: RawMaterialButton( fillColor: Colors.blue, shape: StadiumBorder(), onPressed: () => dispatch(CompActionCreator.change()), child: Text("改变"), ), )) ], ), ); }

action

enum CompAction { change } class CompActionCreator { static Action change() { return const Action(CompAction.change); } }

reducer

Reducer<CompState> buildReducer() { return asReducer( <Object, Reducer<CompState>>{ CompAction.change: _change, }, ); } CompState _change(CompState state, Action action) { final CompState newState = state.clone(); //改变leftAreaComponent中state newState.leftAreaState.text = "LeftAreaState:${Random().nextInt(1000)}"; newState.leftAreaState.color = Color.fromRGBO(randomColor(), randomColor(), randomColor(), 1); //改变rightAreaComponent中state newState.rightAreaState.text = "RightAreaState:${Random().nextInt(1000)}"; newState.rightAreaState.color = Color.fromRGBO(randomColor(), randomColor(), randomColor(), 1); return newState; } int randomColor() { return Random().nextInt(255); } 总结下

总的来说,Component的使用还是比较简单的;如果我们把某个复杂的列表提炼出一个Component的,很明显有个初始化的过程,这里我们需要将:请求参数调体或列表详情操作,在page页面处理好,然后再更新给我们绑定的子Component的State,这样就能起到初始化某个模块的作用;至于刷新,下拉等后续操作,就让Component内部自己去处理了

广播

fish_redux中是带有广播的通信方式,使用的方式很简单,这本是effect层,ctx参数自带的一个api,这里简单介绍一下

使用

action

广播事件单独写了一个action文件,便于统一管理

enum BroadcastAction { toNotify } class BroadcastActionCreator { ///广播通知 static Action toNotify(String msg) { return Action(BroadcastAction.toNotify, payload: msg); } }

发送广播

这是页面跳转的方法,就在此处写了,如果想看详细代码的话,可以去demo地址里面看下

void _backFirst(Action action, Context<SecondState> ctx) { //广播通信 ctx.broadcast(BroadcastActionCreator.toNotify("页面二发送广播通知")); }

接受广播

Effect<FirstState> buildEffect() { return combineEffects(<Object, Effect<FirstState>>{ //接受发送的广播消息 BroadcastAction.toNotify: _receiveNotify, }); } void _receiveNotify(Action action, Context<FirstState> ctx) async { ///接受广播 print("跳转一页面:${action.payload}"); } 说明

广播的使用还是挺简单的,基本和dispatch的使用是一致的,dispatch是模块的,而broadcast是有页面栈,就能通知其他页面,很多情况下,我们在一个页面进行了操作,其他页面也需要同步做一些处理,使用广播就很简单了

注意: 广播发送和接受是一对多的关系,一处发送,可以在多处接受;和dispatch发送事件,如果在effect里面接受,在reducer就无法接受的情况是不一样的(被拦截了)

开发小技巧 弱化reducer

无限弱化了reducer层作用

在日常使用fish_redux和flutter_bloc后,实际能深刻体会reducer层实际上只是相当于bloc中yield
或emit关键字的作用,职能完全可以弱化为,仅仅作为状态刷新;这样可以大大简化开发流程,只需要关注
view -> action -> effect (reducer:使用统一的刷新事件)

下面范例代码,处理数据的操作直接在effect层处理,如需要更改数据,直接对ctx.state进行操作,涉及刷新页面的操作,统一调用onRefresh事件;对于一个页面有几十个表单的情况,这种操作,能大大提升你的开发速度和体验,亲身体验,大家可以尝试下

Reducer<TestState> buildReducer() { return asReducer( <Object, Reducer<TestState>>{ TestAction.onRefresh: _onRefresh, }, ); } TestState _onRefresh(TreeState state, Action action) { return state.clone(); }

具体可以查看 玩android 项目代码;花了一些时间,把玩android项目代码所有模块全部重构了,肝痛

widget组合式开发

说明

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxfxz.html