在开始使用flutter和redux构建应用程序时,我遇到了以下问题:处理网络请求或任何异步操作的最佳方法是什么?
上下文: 当请求完成时,进行异步调用以从服务器端获取一个字符串(在我的情况下仅为Future.delayed),以更新状态并在视图中查看更改。
第一种方法:
创建一个具有异步调用功能的middlewareClass,该异步调用函数将在异步事件完成后再调用NextDispacther,并在化简器中对其进行处理。
class UserTypeMiddleware extends MiddlewareClass<AppState> {
@override
void call(Store<AppState> store, action, NextDispatcher next) async{
if (action is GetTitleAction) {
String title = await Future<String>.delayed(Duration(seconds: 2), () {
return "This is a title ";
});
next(UpdateTitleAction(title));
} else {
next(action);
}
}
}
第二种方法:
创建一个类型相同的typedMiddleware,但是它通过store.dispatch调度动作
TypedMiddleware<AppState, GetTitleAction> userTypeMiddleware() =>
TypedMiddleware<AppState, GetTitleAction>(_getTitle);
Future _getTitle(Store<AppState> store, GetTitleAction action, NextDispatcher next) async {
String title = await Future<String>.delayed(Duration(seconds: 2), () {
return "Flow.me este o aplicatie care va permite sa inchiriati un scooter ";
});
store.dispatch(UpdateTitleAction(title));
next(action);
}
第三种方法:
使用redux_thunk
ThunkAction<AppState> updateTitleAction = (Store<AppState> store) async {
String title = await Future<String>.delayed(Duration(seconds: 2), () {
return "Flow.me este o aplicatie care va permite sa inchiriati un scooter ";
});
store.dispatch(UpdateTitleAction(title));
};
从我的角度来看,我宁愿在中间件中处理服务器请求的逻辑,而不是在动作中处理逻辑(只是为了保持一致性),中间件与用于处理逻辑的reducer处于同一级别。
如果我在异步请求中延迟了中间件中的NextDispatcher调用,它是否以任何方式破坏了redux的想法?这代表一个问题吗?
答案 0 :(得分:1)
处理网络请求或异步操作的最佳方法是为其创建中间件,不要在reducer内处理异步操作(这是redux的反模式,reducer应该是纯函数),或者您可以使用{{ 3}}。