(二)Flutter Redux 中的 combineReducers

(一)Flutter Redux 中,对Redux有了初步的了解和使用,但是还是有些问题。上个例子中ReduxState.dart中只定义了一个参数name,但是如果参数不只一个,有可能还有其他类做为参数,并且数量非常多,这么下来整个类都不好维护,太过于混乱。而且随着业务的增加,action也会越来越多,在getReduce方法中又是根据不同的action来处理不同的业务,action的量增大的话,getReduce函数的体积将变得很大,同时不同业务的方法也全混在了一起。为了解决这个办法,我们有必要将属于同一个业务的逻辑给拆分出去,这时候就刚好可以用到Redux中函数combineReducers。我们把相同业务的拆分出去用,可以使用combineReducers将action和函数绑定起来,减少getReduce里面的代码量。

在上一章的代码上进行修改:
redux_state.dart类里的name参数换成 user.dart、book.dart类,再新增user_reducer.dart
book_reducer.dart 2个类,从命名上能看出user.dart和user_reducer.dart、book.dart和book_reducer.dart是一一对应的。user和book类的逻辑是相似的,这边就拿user类出来讲。
在这里插入图片描述

user.dart

里面只声明一个name参数

class User {
  String name;
  User.initData() : name = "匿名";
}

调整redux_state.dart

/// 定义一个state
class ReduxState {
  User user;
  Book book;
  ReduxState({this.user, this.book});
}

/// 定义action,将action放到各自的reducer类里去定义

/// 定义reducer
ReduxState getReduce(ReduxState state, action) {
  return ReduxState(
    user: UserReducer(state.user, action),
    book: BookReducer(state.book, action)
  );
}

具体调整有将action的定义搬到了UserReducer中去,getReduce函数里不再有if else判断,而是返回一个当前类,而当前类又是由各自的Reduer类(UserReducer)初始化而来的。

具体看user_reducer.dart

UpdateUserAction暂时删掉,主要看AddUserAction方法就行

/// combineReducers的作用是把action和函数绑定起来,
/// 免去了写例如if (action is IncreaseAction)之类的判断语句。
/// 对应的action执行对应的函数。
final UserReducer = combineReducers<User>([
  TypedReducer<User, AddUserAction>(_add),
  TypedReducer<User, UpdateUserAction>(_update),
]);

/// 定义了一个要与AddUserAction绑定一起函数
/// 该函数的作用主要是修改数据,就是之前的if和else里各自要处理的逻辑
User _add(User user, AddUserAction addAction) {
  addAction.user.name = "小明";
  user = addAction.user;
  return user;
}

/// 定义了一个 action AddUserAction
class AddUserAction {
  User user;
  AddUserAction(this.user);
}

通过combineReducers将action和函数绑定起来,免去了写一堆的if else,后续如果有新的业务逻辑,就新加一个action和一个待绑定的函数,并且在combineReducers中将两者绑定起来就行。

store的dispatch方法调整

之前的版本是在state中定义了action,再由Store来触发action。
store.dispatch(Action.Change);

新的话也是由Store来触发action,但对应的action不再是枚举,而是实例化对应的reducer类。
store.dispatch(AddUserAction(store.state.user));

效果

在这里插入图片描述

代码

代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值