在 (一)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));