Асинхронный запрос с использованием BLoC во Flutter

Я хочу скачать данные, но при этом постоянно использую приложение.

Можете ли вы сказать мне, правильное ли это решение?

Дело в том, что мы нажимаем кнопку загрузки и вызываем функцию bloc.dispatch (Event.download ());

В mapEventToState в событии _Download мы запрашиваем данные. Но мы не ждем ответа, потому что не хотим блокировать другие события, которые меняют представление.

Итак, я создаю Future и после получения ответа вызываю событие _UpdateData (), где обрабатываю загруженные данные и генерирую с ними состояние.

Ничего страшного? Есть параметр _requestTime, чтобы проверить, был ли это последний запрос.

class Bloc {
  DateTime _requestTime;

  @override
  Stream<State> mapEventToState(Event event) async* {
    if (event is _Download) {
      yield DownloadingState();
      _request();
    } else if (event is _UpdateData) {
      if(!event.requestTime.isBefore(_requestTime))
        yield DownladedState(event.response);
    }
  }

  _request() {
    _requestTime = DateTime.now();
    repository.downloadData().then((response) {
      dispatch(_UpdateData(response));
    });
  }
}

person Krzysztof Wizner    schedule 16.01.2020    source источник
comment
Не могли бы вы упростить свой вопрос? В настоящее время сложно понять, в чем вам нужна помощь.   -  person João Soares    schedule 16.01.2020


Ответы (1)


Сообщите мне, если это сработает

Изменить добавленную доходность * перед _request

@override
Stream<State> mapEventToState(Event event) async* {
if (event is _Download) {
  yield DownloadingState();
 yield* _request();
} else if (event is _UpdateData) {
  if(!event.requestTime.isBefore(_requestTime))
    yield DownladedState(event.response);
}
}

_request() async*{
_requestTime = DateTime.now();
repository.downloadData().then((response) {
  dispatch(_UpdateData(response));
});
}
}
person vivek yadav    schedule 16.01.2020