Я использую флаттер с шаблоном 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) })
, но код внутри никогда не выполняется. Я попытался отладить, но не могу достичь точки останова.