Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Flatter redux中处理异步事件的最佳方法_Redux_Flutter_Flutter Redux - Fatal编程技术网

在Flatter redux中处理异步事件的最佳方法

在Flatter redux中处理异步事件的最佳方法,redux,flutter,flutter-redux,Redux,Flutter,Flutter Redux,在开始使用flatter和redux构建应用程序时,我遇到了以下问题:处理网络请求或任何异步操作的最佳方式是什么 背景: 当请求完成更新状态并在视图中查看更改时,进行异步调用以从服务器端获取字符串(在我的示例中只是Future.delayed) 第一种方法: 创建一个具有异步调用函数的middlewareClass,该函数将在异步事件完成调用NextDispatcher后,使用将在还原程序中处理的新操作等待该事件完成 class UserTypeMiddleware extends Middl

在开始使用flatter和redux构建应用程序时,我遇到了以下问题:处理网络请求或任何异步操作的最佳方式是什么

背景: 当请求完成更新状态并在视图中查看更改时,进行异步调用以从服务器端获取字符串(在我的示例中只是Future.delayed)

第一种方法:

创建一个具有异步调用函数的middlewareClass,该函数将在异步事件完成调用NextDispatcher后,使用将在还原程序中处理的新操作等待该事件完成

 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);
        }
      }

    }
class UserTypeMiddleware扩展了MiddlewareClass{
@凌驾
void调用(存储、操作、NextDispatcher next)异步{
if(操作是GetTitleAction){
字符串标题=等待未来。延迟(持续时间(秒数:2),(){
返回“这是一个标题”;
});
下一步(UpdateTitleAction(标题));
}否则{
下一步(行动);
}
}
}
第二种方法:

创建一个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);
}
typedmidware userTypeMiddleware()=>
类型dmidware(_getTitle);
Future\u getTitle(存储存储、GetTitleAction、NextDispatcher next)异步{
字符串标题=等待未来。延迟(持续时间(秒数:2),(){
返回“Flow.me este o APPLICATIE care va permite sa inchiriati un scooter”;
});
存储调度(UpdateTitleAction(标题));
下一步(行动);
}
第三种方法:

使用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));
};
ThunkAction updateTitleAction=(存储)异步{
字符串标题=等待未来。延迟(持续时间(秒数:2),(){
返回“Flow.me este o APPLICATIE care va permite sa inchiriati un scooter”;
});
存储调度(UpdateTitleAction(标题));
};
从我的观点来看,我宁愿在中间件中处理服务器请求的逻辑,而不是在操作中处理逻辑——只是为了一致性——为了处理逻辑,中间件与减速机处于同一级别


如果我在中间件中调用NextDispatcher,并从异步请求中获得延迟,那么它是否以任何方式打破了redux的想法?这可能是个问题吗

处理网络请求或异步操作的最佳方法是为其创建中间件,不要在reducer内部处理异步操作(这是一种redux反模式,reducer应该是纯函数),或者您可以使用