Flutter: считывает данные потока в состоянии Blo C и повторно отображает пользовательский интерфейс, если он изменяется - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблема с использованием шаблона Blo C в сочетании с отображением процесса загрузки с использованием Dio.

Может кто-нибудь сказать мне, как перевести onUploadProgress из dio в состояние blo c и отображать его, когда прогресс в состоянии обновляется?

На данный момент у меня есть пользовательский интерфейс, Blo C и класс API. Мне нужно передать свой blo c в вызов API, чтобы загрузить файл, а затем добавить дополнительное событие, например:

onReceiveProgress: (int received, int total) => {
          bloc.add(DownloadingImages((received / total) * 100))
        });

Также есть большая проблема, которую я нашел, и я не знаю, как решить в чистом виде. Если я добавлю состояние DownloadingImage и передам процесс, он не обновит интерфейс. Это происходит потому, что состояние не изменяется, а только значение внутри него. BlocBuilder не распознает изменение значения внутри состояния и не будет повторно отображать пользовательский интерфейс ...

Так что у меня есть другой обходной путь (Blo C):

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);
          }

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

...