У меня есть модальный режим с CircularProgressIndicator и текстом в строке. Я хочу показать модальный режим при извлечении данных из firebase на основе истинной или ложной переменной в начале действительной функции формы, он показывает модальный на основе переменной состояния loadingIndicator, но когда запрос завершен, он продолжает отображаться после установки состояния loadIndicator в false. Где нужно показать и скрыть диалог
if (_formKey.currentState.validate()) {
setState(() {
loadingIndicator = true;
});
loadingIndicator ? loadingAlert(context) : null;
AuthService()
.signIn(emailController.text,
passwordController.text)
.then((user) {
switch (user) {
case 'ERROR_USER_NOT_FOUND':
setState(() {
_emailError = 'User not found';
loadingIndicator = false;
});
return;
break;
case 'ERROR_WRONG_PASSWORD':
setState(() {
_passwordError = 'Password is wrong';
loadingIndicator = false;
});
return;
break;
}
}
loadingAlert(
BuildContext context,
) {
alertDialog = Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Card(
child: Material(
child: Container(
width: MediaQuery.of(context).size.width * 0.85,
height: 60,
child: Row(
children: <Widget>[
Container(
padding: EdgeInsets.only(left: 20),
child: CircularProgressIndicator(),
),
Container(
padding: EdgeInsets.only(left: 20),
child: Text(
'Please wait...',
style: TextStyle(fontSize: 18),
),
)
],
),
),
))
],
),
);
showDialog(context: context, builder: (_) => alertDialog);
}
Диалоговое окно скрывается, когда для состояния loadIndicator установлено значение false
Вы можете использовать FutureBuilderдля этого и использовать snapshot.active для состояния запроса. Подробнее в официальных документах: https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
Попробуйте этот код:
FutureBuilder(
future: AuthService()
.signIn(emailController.text, passwordController.text),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
showDialog(
context: context,
builder: (BuildContext context) {
return CircularProgressIndicator();
});
}
if (snapshot.connectionState == ConnectionState.done) {
Navigator.pop(context);
switch (snapshot.data) {
case 'ERROR_USER_NOT_FOUND':
setState(() {
_emailError = 'User not found';
});
return;
break;
case 'ERROR_WRONG_PASSWORD':
setState(() {
_passwordError = 'Password is wrong';
});
return;
break;
}
}
},
)