Хобрук: Ваш путь к мастерству в программировании

Flutter: как изменить значение ProgressBar в алербоксе, используя цикл for

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

я использовал двойную переменную для значения индикатора выполнения, и я использовал заданное состояние, чтобы изменить значение, но значение, отображаемое после полного завершения цикла For, только

Double percent = 0.0;
//When press upload Button   
onPressed: () async {              showDialog(
          context: context,
          builder: (BuildContext context) {
            return CircularPercentIndicator(
              radius: 60.0,
              lineWidth: 5.0,
              percent: percente??0.0,
              progressColor: Colors.green,
            );

          });


    await uploadfiles();
}


/// upload file 
 for (int i = 0; i < file2upload.length; i++) {
 //upload function for file2uplaod[i]
  setState(() {
            percente = (i/ file2upload.length);
          });

}

Я ожидаю, что значение индикатора выполнения обновляется, когда мы устанавливаем состояние каждого цикла for, но индикатор выполнения, просматриваемый после цикла for, полностью заканчивается

22.08.2019

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

Ответы:


1

Вам нужно создать собственный класс для диалога. Как это

class MyDialog extends StatefulWidget {
  @override
  _MyDialogState createState() => _MyDialogState();
}

class _MyDialogState extends State<MyDialog> {
  double _progress = 0;

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      content: Text("Progress = ${_progress}"),
      actions: <Widget>[
        FlatButton(
          child: Text("Start"),
          onPressed: () {
            Timer.periodic(Duration(milliseconds: 10), (timer) {
              if (_progress > 100) timer.cancel();

              setState(() {
                if (_progress < 100) _progress += 1;
              });
            });
          },
        )
      ],
    );
  }
}

И использовать его как

showDialog(context: context, builder: (_) => MyDialog());

Вывод:

введите здесь описание изображения

22.08.2019
  • Спасибо, но я пытаюсь вызвать другую функцию для загрузки файлов, и я хочу установить данные извне MyDialog() 22.08.2019
  • Вы можете передать данные конструктору MyDialog, создав несколько полей. Это способ решить вашу проблему. 22.08.2019
  • @FirasHamzahMelhem Сначала вы приняли ответ, а теперь отменяете его, могу я узнать, если что-то пошло не так? 22.08.2019
  • Извините за это, но это не сработало, я хочу установить значение Progress вне класса, и это моя проблема, и ваше решение делает то же самое, что и моя проблема, поэтому мне нужно другое решение от других людей, уважающих вас 22.08.2019
  • Итак, я обнаружил, что все, что вы можете сделать, это передать значение один раз, а затем вам нужно использовать значение внутри класса MyDialog. Будет ли это работать? 22.08.2019
  • Да, но функция Uplaodfile() использует некоторые переменные из основного состояния, и я не могу использовать их в MYDialog, поэтому я должен вызывать функцию извне MYDialog, и проблема все еще 22.08.2019

  • 2

    Вы можете создать собственный диалог, и с помощью Stream вы можете передать текущий прогресс из-за пределов класса диалога. Пожалуйста, найдите пример ниже.

    class MyPercentageProgress extends StatefulWidget {
      final Stream<double> stream;
      MyPercentageProgress(this.stream);
      @override
      _MyPercentageProgress createState() => _MyPercentageProgress();
    }
    
    class _MyPercentageProgress extends State<MyPercentageProgress> {
      double progress = 0.0;
    
      StreamSubscription<double> subscribe;
    
      @override
      void initState() {
        super.initState();
        subscribe = widget.stream.listen((compressProgress) {
          setState(() {
            progress = compressProgress;
          });
        });
      }
    
      @override
      void dispose() {
        subscribe.cancel();
        super.dispose();
      }
      
      @override
      Widget build(BuildContext context){
        return CircularPercentIndicator(
              radius: 60.0,
              lineWidth: 5.0,
              percent: progress,
              progressColor: Colors.green,
            );
    
          };
      }
    }
    

    А из другого класса вы можете нажать на этот диалог и добавить в него потоки, как показано ниже.

     //start dialog
     StreamController<double> streamController = StreamController<double>();
     Navigator.of(context).push(PageRouteBuilder(
            opaque: false,
            pageBuilder: (BuildContext context, _, __) {
              return MyPercentageProgress(streamController.stream);
            }));
    
     //add stream with percentage done
     streamController.add(progress);
    

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

    Позвольте мне знать, если это помогает.

    06.02.2021
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...