У меня проблема с использованием шаблона BloC в сочетании с отображением процесса загрузки с помощью Dio.
Может ли кто-нибудь сказать мне, как перевести onUploadProgress из dio в состояние блока и отобразить его, когда прогресс внутри состояния обновляется?
На данный момент у меня есть пользовательский интерфейс, блок и класс API. Мне нужно передать свой блок в вызов API, чтобы загрузить файл, а затем добавить дополнительное событие, например:
onReceiveProgress: (int received, int total) => {
bloc.add(DownloadingImages((received / total) * 100))
});
Также есть большая проблема, которую я обнаружил, и я не знаю, как решить ее по-чистому. Если я добавлю состояние DownloadingImage и передам процесс, он не обновит пользовательский интерфейс. Это происходит потому, что состояние не изменяется, а изменяется только значение внутри него. BlocBuilder не распознает изменение значения внутри состояния и не будет повторно отображать пользовательский интерфейс...
Итак, у меня есть другой обходной путь (BloC):
if (state is ImagesDownloading) {
imageBloc.add(DownloadingImages2(state.progress));
if (state.progress < 100) {
return DownloadAndProgressWidget(
done: false, progress: state.progress);
} else {
return DownloadAndProgressWidget(done: true, progress: 100);
}
} else if (state is ImagesDownloading) {
imageBloc.add(DownloadingImages2(state.progress));
if (state.progress < 100) {
return DownloadAndProgressWidget(
done: false, progress: state.progress);
} else {
return DownloadAndProgressWidget(done: true, progress: 100);
}
ImageState _downloadImages(String localPath) {
try {
api.fetchLibraryImagesFromBackend(localPath, this);
return ImagesDownloading(0);
// Update the ui later from here to show progress.
// Get the progress and pass it to downloading when 100% is reached return ImagesDownloaded state
} on ImagesError {
return ImagesError("Couldn't download images.");
}
В пользовательском интерфейсе:
} else if (state is ImagesDownloading) {
imageBloc.add(DownloadingImages2(state.progress));
if (state.progress < 100) {
return DownloadAndProgressWidget(
done: false, progress: state.progress);
} else {
return DownloadAndProgressWidget(done: true, progress: 100);
}
} else if (state is ImagesDownloading) {
imageBloc.add(DownloadingImages2(state.progress));
if (state.progress < 100) {
return DownloadAndProgressWidget(
done: false, progress: state.progress);
} else {
return DownloadAndProgressWidget(done: true, progress: 100);
}
Я хотел бы увидеть чистое решение этой проблемы.