Лучший способ обрабатывать асинхронные события в флаттер-редуксе
Приступая к созданию приложения с использованием флаттера и редукса, я столкнулся со следующей проблемой: как лучше всего обрабатывать сетевой запрос или любое асинхронное действие?
Контекст: Сделайте асинхронный вызов, чтобы получить строку со стороны сервера (в моем случае просто 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));
};
С моей точки зрения, я бы предпочел иметь дело с логикой обработки запросов к серверу в промежуточном программном обеспечении, а не в действии - просто ради согласованности - промежуточное программное обеспечение находится на том же уровне, что и редуктор, для обработки логики.
Не нарушает ли это идею избыточности, если я вызываю NextDispatcher в промежуточном программном обеспечении с задержкой асинхронного запроса? Может ли это представлять проблему?
1 ответ
Лучший способ обработать сетевой запрос или асинхронное действие - создать для него промежуточное программное обеспечение, никогда не обрабатывать асинхронное действие внутри редуктора (это анти-шаблон редукса, редуктор должен быть чистыми функциями), или вы можете использовать избыточный поток.