Лучший способ обрабатывать асинхронные события в флаттер-редуксе

Приступая к созданию приложения с использованием флаттера и редукса, я столкнулся со следующей проблемой: как лучше всего обрабатывать сетевой запрос или любое асинхронное действие?

Контекст: Сделайте асинхронный вызов, чтобы получить строку со стороны сервера (в моем случае просто 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 ответ

Лучший способ обработать сетевой запрос или асинхронное действие - создать для него промежуточное программное обеспечение, никогда не обрабатывать асинхронное действие внутри редуктора (это анти-шаблон редукса, редуктор должен быть чистыми функциями), или вы можете использовать избыточный поток.

Другие вопросы по тегам