我有一个用于使用firebase_auth登录到Firebase的函数,但是,每当引发异常时,它都不会被捕获并仍然出现在Android Studio控制台中,也不会运行catch块中的打印语句
我该如何解决?
signIn({String email, String password}) {
print('listened');
try {
FirebaseAuth.instance.signInWithEmailAndPassword(
email: email, password: password);
}
on PlatformException catch (signUpError) {
print(signUpError.code);
if (signUpError.code == 'ERROR_WEAK_PASSWORD') {
print('Weak Password');
}else if(signUpError.code=='ERROR_USER_NOT_FOUND'){
print('Invalid Username');
}
else{
print(signUpError.toString());
}
}
}
答案 0 :(得分:2)
signInWithEmailAndPassword
返回一个Future<AuthResult>
(它是异步的),因此在调用异步方法时,您需要使用catchError
方法来捕获错误:
FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password).then((result) {
print(result);
})
.catchError((error) {
print("Something went wrong: ${error.message}");
});
检查以下内容:
https://api.dart.dev/stable/2.3.0/dart-async/Future/catchError.html
https://medium.com/firebase-tips-tricks/how-to-use-firebase-authentication-in-flutter-50e8b81cb29f
答案 1 :(得分:0)
如果 Firebase 调用在 try catch
函数内并且在调用 Firebase 时使用 async
语句,则 await
块将起作用。
例如,在以下代码中,获取令牌的错误将被 on PlatformException catch (...
块捕获,但将令牌写入 FB RTDB 的错误不会是:
Future<void> _saveDeviceToken() async {
try {
final _currentUser = _firebaseAuth.currentUser;
final fcmToken = await _firebaseMessaging.getToken();
if (fcmToken != null) {
// Save the token to Firebase - NO AWAIT STATEMENT
globals.firebaseDatabase
.reference()
.child("pushTokens")
.child("${_currentUser.uid}")
.set({"token": fcmToken});
}
} on PlatformException catch (error, stackTrace) {
print("error: $error");
}
}
而添加 await
语句(如以下代码所示)也会在写入 FB RTDB 时捕获错误:
Future<void> _saveDeviceToken() async {
try {
final _currentUser = _firebaseAuth.currentUser;
final fcmToken = await _firebaseMessaging.getToken();
if (fcmToken != null) {
// Save the token to Firebase - AWAIT STATEMENT ADDED
await globals.firebaseDatabase
.reference()
.child("pushTokens")
.child("${_currentUser.uid}")
.set({"token": fcmToken});
}
} on PlatformException catch (error, stackTrace) {
print("error: $error");
}
}
如果您不想或不能使用 await
,那么根据 Peter 的回答,解决方案是使用 catchError
语句而不是 try catch
。