#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(