Как создать диалоговое окно выполнения во время выполнения задачи, а после завершения диалоговое окно задачи должно быть закрыто?

#dart #flutter #async-await

#dart #флаттер #асинхронное ожидание

Вопрос:

Как мне добавить Progressbar?

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

в поднятой кнопке:

 onPressed: () async {
  (isOffline)
  ? showSnackBar(context)
  : checkingValidation(usernameController, context, _url);
}


checkingValidation(TextEditingController usernameController, BuildContext context, String _url) async {
if(....){
...
}else{
    Navigator.push(
       context,
       MaterialPageRoute(
       builder: (context) => HomePage()))
}
  

Ответ №1:

Вы должны использовать Stack и внутри этого диалогового окна use alert по своему усмотрению. Добавьте флаг, например bool showProgress , всякий раз, когда вам нужно, чтобы диалоговое окно с предупреждением о ходе выполнения отображалось или скрывалось, просто установите showProgress=true или showProgress=false соответственно, setState чтобы показать или скрыть виджет диалогового окна оповещения.

или просто используйте этот шаблон, который я создал.

   static showProgressDialog(BuildContext context, String title) {
    try {
      showDialog(
          context: context,
          barrierDismissible: false,
          builder: (context) {
            return AlertDialog(
              content: Flex(
                direction: Axis.horizontal,
                children: <Widget>[
                  CircularProgressIndicator(),
                  Padding(padding: EdgeInsets.only(left: 15),),
                  Flexible(
                      flex: 8,
                      child: Text(
                        title,
                        style: TextStyle(
                            fontSize: 16, fontWeight: FontWeight.bold),
                      )),
                ],
              ),
            );
          });
    } catch (e) {
      print(e.toString());
    }
  }
  

когда вы хотите показать это, просто позвоните
AppUtils.showProgressDialog(context, "Please wait");

когда вы выполнили задачу, просто вызовите Navigator.pop(context);

Вы можете создать класс as AppUtils и поместить этот шаблон в class, чтобы вы могли повторно использовать его в любом месте вашего приложения.

Комментарии:

1. как я уже сказал, создайте класс с любым именем, которое вы хотите, например AppUtils . поместите эту функцию в этот класс. Затем всякий раз, когда вам нужно показать диалоговое окно выполнения, просто вызывайте AppUtils.showProgressDialog(context, "Please wait"); всякий раз, когда вы закончили с вызовом задачи Navigator.pop , чтобы закрыть диалоговое окно оповещения

2. Спасибо. Это работает хорошо. Но я смутился, потому что я вызывал AppUtils при нажатии кнопки и каждое отдельное утверждение проверки, которое я вызывал navigator.pop

3. не понимаю, в чем проблема, можете ли вы объяснить и добавить некоторый код.

4. checking2(TextEditingController usernameController, BuildContext context, String _url) async { AppUtils.showProgressDialog(context, "Please wait");

5.каждый отдельный ShowDialog if (model.data.hasAccess == 0) { Navigator.pop(context); showDialog(