Я создал страницу входа с помощью firebase. Когда пользователь нажимает кнопку входа в систему, запускается CircularProgressIndicator, и если пользователь ввел правильные учетные данные, все работает отлично, но если есть ошибка (например, пользователь не найден ИЛИ неправильный пароль), пользователь будет перенаправлен не на следующую страницу, а на следующую страницу. Индикатор CircularProgressIndicator не перестанет отображаться.
Цель состоит в том, что если есть ошибка, я хочу остановить CircularProgressIndicator и хочу показать сообщение об ошибке, но я не знаю, как остановить CircularProgressIndicator.
Мой код выглядит следующим образом:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
final navigatorKey = GlobalKey<NavigatorState>();
class LoginUser {
Future loginUser(userEmail, userPassword, context) async {
navigatorKey: navigatorKey;
showDialog(
barrierDismissible: false,
context: context,
builder: (context) => Center(child: CircularProgressIndicator())
);
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: userEmail,
password: userPassword
);
// Close Dialog when route changes
} on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') {
return "ec-unf";
} else if (e.code == 'wrong-password') {
return "ec-wp";
}
navigatorKey.currentState!.popUntil((route) => route.isFirst);
}
}
}
Does anybody know how to do this?
Thanks!
Chris
возможно, вы можете добавить isLoading и окончательное условие после попытки поймать
isLoading = true
try {
//your code
print("done !");
isLoading
} catch (err) {
print("error");
isLoading = false
} finally {
print("Finish "); //error and success
isLoading = false
}
Просто для полноты, вот как я это решил.
Я создал отдельную функцию в файле входа в систему, и когда я нажал кнопку «Войти», была выполнена следующая функция:
Future login() async{
isSignInLoading = true; // START LOADING CYCLE
// --- LOADING CYCLE - START ---
if (isSignInLoading == true) {
showDialog(
barrierDismissible: false,
context: context,
builder: (context) => Center(child: CircularProgressIndicator())
);
}
// --- LOADING CYCLE - END ---
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: _controllerEmail.text,
password: _controllerPassword.text
);
} catch (e) {
isSignInLoading = false; // START LOADING CYCLE
isErrorLogin = true; // START LOADING CYCLE
}
Navigator.of(context).pop();
// --- ERROR MESSAGE - START ---
if (isErrorLogin == true) {
showDialog(
barrierDismissible: false,
context: context,
builder: (context) => Center(child:
AlertDialog(
title: const Text('Something went wrong!'),
content: const Text('Please check your entries, either the user does not exist or the password is incorrect.'),
actions: [
TextButton(
child: const Text(
'Close',
style: TextStyle(
color: Color(0xff004494),
fontWeight: FontWeight.w500
),
),
onPressed: () {
Navigator.of(context).pop();
},
),
],
)
)
);
}
// --- ERROR MESSAGE - END ---
//var loginInfo = await LoginUser().loginUser(_controllerEmail.text,_controllerPassword.text, context);
if (FirebaseAuth.instance.currentUser != null) {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("userLoginStatus", true);
Navigator.popAndPushNamed(context, '/overview');
}
}
Уверен, что есть лучший способ сделать это, но это сработало для меня.
Спасибо. Я использовал это решение, но мне пришлось переместить функцию из отдельного файла на главную страницу входа, и тогда она работала отлично!