reducer里面,理论上也是可以处理一些和数据相关,简单的逻辑;但是复杂的,会产生相应较大的“副作用”的业务逻辑,还是需要在effect中写
范例说明这边写几个示例,来演示fish_redux的使用
计数器
fish_redux正常情况下的流转过程
fish_redux各模块怎么传递数据
页面跳转
A ---> B(A跳转到B,并传值给B页面)
B ---> A(B返回到A,并返回值给A页面)
列表文章
列表展示-网络请求
列表修改-单item刷新
多样式列表
列表存在的问题+解决方案
全局模块
全局切换主题
全局模式优化
大幅度提升开发体验
Component使用
page中使用component
广播
开发小技巧
弱化reducer
widget组合式开发
计数器 效果图这个例子演示,view中点击此操作,然后更新页面数据;下述的流程,在effect中把数据处理好,通过action中转传递给reducer更新数据
view ---> action ---> effect ---> reducer(更新数据)
注意:该流程将展示,怎么将数据在各流程中互相传递
标准模式main
这地方需要注意,cupertino,material这类系统包和fish_redux里包含的“Page”类名重复了,需要在这类系统包上使用hide,隐藏系统包里的Page类
关于页面的切换风格,可以在MaterialApp中的onGenerateRoute方法中,使用相应页面切换风格,这边使用ios的页面切换风格:cupertino
///需要使用hide隐藏Page import 'package:flutter/cupertino.dart'hide Page; import 'package:flutter/material.dart' hide Page; void main() { runApp(MyApp()); } Widget createApp() { ///定义路由 final AbstractRoutes routes = PageRoutes( pages: <String, Page<Object, dynamic>>{ "CountPage": CountPage(), }, ); return MaterialApp( title: 'FishDemo', home: routes.buildPage("CountPage", null), //作为默认页面 onGenerateRoute: (RouteSettings settings) { //ios页面切换风格 return CupertinoPageRoute(builder: (BuildContext context) { return routes.buildPage(settings.name, settings.arguments); }) // Material页面切换风格 // return MaterialPageRoute<Object>(builder: (BuildContext context) { // return routes.buildPage(settings.name, settings.arguments); // }); }, ); }state
定义我们在页面展示的一些变量,initState中可以初始化变量;clone方法的赋值写法是必须的
class CountState implements Cloneable<CountState> { int count; @override CountState clone() { return CountState()..count = count; } } CountState initState(Map<String, dynamic> args) { return CountState()..count = 0; }view:这里面就是写界面的模块,buildView里面有三个参数
state:这个就是我们的数据层,页面需要的变量都写在state层
dispatch:类似调度器,调用action层中的方法,从而去回调effect,reducer层的方法
viewService:这个参数,我们可以使用其中的方法:buildComponent("组件名"),调用我们封装的相关组件
Widget buildView(CountState state, Dispatch dispatch, ViewService viewService) { return _bodyWidget(state, dispatch); } Widget _bodyWidget(CountState state, Dispatch dispatch) { return Scaffold( appBar: AppBar( title: Text("FishRedux"), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('You have pushed the button this many times:'), ///使用state中的变量,控住数据的变换 Text(state.count.toString()), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () { ///点击事件,调用action 计数自增方法 dispatch(CountActionCreator.countIncrease()); }, child: Icon(Icons.add), ), ); }action
该层是非常重要的模块,页面所有的行为都可以在本层直观的看到
XxxxAction中的枚举字段是必须的,一个事件对应有一个枚举字段,枚举字段是:effect,reducer层标识的入口
XxxxActionCreator类中的方法是中转方法,方法中可以传参数,参数类型可任意;方法中的参数放在Action类中的payload字段中,然后在effect,reducer中的action参数中拿到payload值去处理就行了