Flutter: прочитайте данные потока состояния BloC и повторно отобразите пользовательский интерфейс, если он изменится.

У меня проблема с использованием шаблона 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);
          }

Я хотел бы увидеть чистое решение этой проблемы.


person SiLenT_Tz    schedule 16.04.2020    source источник
comment
У вас есть решение для этого? У меня такой же случай. Я люблю знать чистое решение.   -  person wilfredonoyola    schedule 17.10.2020
comment
возможно, вам следует реализовать метод equals() внутри класса DownloadingImages, где процент выполнения должен определять свойство равенства   -  person Khamidjon Khamidov    schedule 04.06.2021