Как закрыть диалоговое окно на основе загрузки состоянияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как закрыть диалоговое окно на основе загрузки состояния

Сообщение Anonymous »

В этом коде я отобразил диалоговое окно двумя способами:
  • В методе публикации
    2.Другой при нажатии кнопки входа в систему
    с помощью setstate либо true, либо false.
Теперь, пока код состояния = 200, диалоговое окно открывается и закрывается в случае успеха. но если произойдет другая ошибка; например: если идентификатор пароля не совпадает, на панели закусок отображается сообщение об ошибке, но диалоговое окно не закрывается. Какие изменения мне следует внести в приведенный ниже код и любые другие простые способы реализации диалогового окна, пока оно не обработает метод post. (я пытаюсь показать индикатор прогресса/загрузки).
Оно должно закрываться автоматически когда метод завершается, пользователь никуда не нажимает

Код: Выделить всё

//imports

class Login extends StatefulWidget {
const Login({super.key});

@override
State createState() => _LoginState();
}

class _LoginState extends State {
//other intilizations
bool isLoading = false;

@override
void initState() {
super.initState();

}

Future postUser() async {
if (!_formKey.currentState!.validate()) return;
setState(() {
isLoading = true;
});
showAlertDialog(context);
final encodedUser = Uri.encodeComponent(_usernameController.text);
final encodedPassword = Uri.encodeComponent(_passwordController.text);
var url = Uri.parse(
'${Config.baseUrl}/token',
);
var bodyData = {
'username': encodedUser,
'password': encodedPassword,
'grant_type': "password"
};
try {
final response = await http.post(url, body: bodyData);
if (response.statusCode == 200) {
final responseBody = jsonDecode(response.body);
if (responseBody.containsKey('access_token')) {
Token user = Token.fromJson(responseBody);
if (user.accessToken.isNotEmpty) {
await _storeToken(user.accessToken);
Navigator.pushNamed(context, '/Home');
} else {
_showSnackBar('Authentication failed. Please try again.');
}
} else {
_showSnackBar('Authentication failed. No access token received.');
}
} else if (response.statusCode == 400) {
_showSnackBar('Credentials did not match !: ${response.statusCode}');
}
} on SocketException catch (_) {
_showSnackBar(
'No internet connection. Please check your connection and try again.');
} on HttpException catch (_) {
_showSnackBar('Could not connect to the server. Please try again later.');
} catch (e, stackTrace) {
print('Exception occurred: $e');
print('Stack trace: $stackTrace');
_showSnackBar('An unexpected error occurred.  Please try again.');
} finally {}
setState(() {
isLoading = false;
});
}

//other methods

void _showSnackBar(String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
message,
),
),
);
}

void showAlertDialog(BuildContext context) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Center(child: Text('Logging In')),
content: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.symmetric(
vertical: 0, horizontal: screenWidth * 0.27),
child: ListBody(
children: const [
CircularProgressIndicator(),
],
),
),
),
);
},
);
}

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Config.backgroundColor,
body: SafeArea(
child: SingleChildScrollView(
child: Column(
children: [

//other ui
),
//form
Padding(
padding: EdgeInsets.only(top: screenHeight * 0.03),
child: Form(
key: _formKey,
child: Column(
children: [

// form fields to enter id and password

Padding(
padding: EdgeInsets.only(top: 0.032 * screenHeight),
child: ElevatedButton(
onPressed: () {
setState(() {
isLoading = true;
});
showAlertDialog(context);
postUser();
setState(() {
isLoading = false;
});
},
style: ElevatedButton.styleFrom(
backgroundColor: Config.themeMainColor,
shadowColor: Colors.transparent,
fixedSize: Size(
screenWidth * 0.5,
screenHeight * 0.01,
),
),
child: Text(
'Login',
style: TextStyle(
color: Config.backgroundColor,
fontSize: 16 * (screenWidth / 360)),
//other parts
}

Я пытался показать индикатор загрузки, когда isLoading==true, и закрывается, когда isloading==false, либо при успешном или неудачном методе сообщения

Подробнее здесь: https://stackoverflow.com/questions/783 ... te-loading
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»