флаттер и бл c асинхронный выход - PullRequest
0 голосов
/ 06 марта 2020

Я использую флаттер с шаблоном BLo C (с библиотекой flutter_blo c), и у меня есть следующие события:

PersonalFileAddedEvent(File file), PersonalFileUploadEvent(PersonalFile file) (оба простираются от PersonalFileEvent)

Файл - это файл из средства выбора файлов, PersonalFile - это класс, имеющий следующие статусы перечисления: READY_TO_UPLOAD, UPLOADING, UPLOAD_FINISHED.

И этот статус из BLo C:

PersonalFileListLoadedState(List<PersonalFile> files) (от PersonalFileListState)

Когда пользователь выбирает файл, пользовательский интерфейс вызывает событие PersonalFileAddedEvent и передает его в BLo C, который создает объект PersonalFile и устанавливает для него статус READY_TO_UPLOAD. Этот PersonalFile объект добавляется в список, который содержит все PersonalFile, которые пользователь добавляет (и загружает). Затем BLo C отвечает (yield) с помощью PersonalFileListLoadedState(blocPersonalFileList) на пользовательский интерфейс для визуализации информации.

После добавления кнопка «Загрузить сейчас» отображается в пользовательском интерфейсе для этого PersonalFile , При нажатии это вызывает событие PersonalFileUploadEvent и отправляет по PersonalFile на BLo C, чтобы начать процесс загрузки (многочастная загрузка). Сразу после получения события BLo C обновляет статус этого PersonalFile до UPLOADING и yield состояние PersonalFileListLoadedState с обновлением статуса PersonalFile для пользовательского интерфейса, чтобы показать, что он загружается.

метод, который загружает составной файл, asyn c:

Future<PersonalFile> upload(PersonalFile file) async { //upload code }

Это mapEventToState из flutter_blo c:

Stream<PersonalFileListState> mapEventToState(PersonalFileEvent event) async* {}

Внутри этого mapEventToState метода я жду метод загрузки, чтобы обновить статус PersonalFile до UPLOAD_FINISHED.

Проблема начинается сейчас, когда пользователь добавляет несколько файлов из средства выбора файлов и нажимает все кнопки «загрузки». BLo C блокируется после получения первого события и обрабатывает события «синхронно как», а пользовательский интерфейс остается таким, как если бы кнопка «Загрузить» другого PersonalFile не была нажата до тех пор, пока не завершится первая (затем следующая и т. Д.). ).

После того, как одно событие будет полностью обработано (загрузка завершена), будет обработано следующее, что имеет смысл, так как я ожидаю, когда метод загрузки завершится sh.

Как могу ли я написать этот код так, чтобы, если пользователь нажимал несколько кнопок «загрузки» в пользовательском интерфейсе, BLo C не блокировался (и, следовательно, пользовательский интерфейс, потому что BLo C не может yield новое состояние) и все файлы загружаются параллельно, но только до тех пор, пока каждый из них не завершит BLo C отправляет новые List из PersonalFile с изменением их статуса на UPLOAD_FINISHED?

Я попытался изменить загрузку подпись метода:

Stream<PersonalFile> upload(PersonalFile file) async* { //upload code }

и использование:

.then((file) { yield PersonalFileListLoadedState(listWithUpdatedPersonalFileStatus) })

, но код внутри никогда не выполняется. Я попытался отладить, но не могу достичь точки останова.

1 Ответ

0 голосов
/ 08 апреля 2020

Не уверен, как вы вызываете blo c, чтобы начать процесс загрузки. Но если вы используете bloc.add(event) при нажатии кнопки, она должна обрабатываться асинхронно и выдавать новые статусы по мере необходимости.

Также обратите внимание, что при обработке изменения состояния, если такое же состояние Если прослушать несколько раз, слушатель прослушает его только один раз, поэтому вы не увидите более одного обновления в вашем пользовательском интерфейсе.

Надеюсь, это поможет.

...