我有一个使用firebase_auth登录Firebase的函数,然而,每当抛出异常时,它都不会被捕获,仍然会出现在Android Studio控制台中,catch块中的print语句也不会运行。
我该如何解决这个问题?
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());
}
}
}
发布于 2020-03-23 22:35:12
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
发布于 2021-01-05 17:47:05
如果Firebase调用在async
函数中,并且在调用Firebase时使用await
语句,则try catch
块将起作用。
例如,在下面的代码中,获取令牌的错误将被on PlatformException catch (...
块捕获,但将令牌写入For的错误不会被捕获:
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时出现的错误:
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
。
https://stackoverflow.com/questions/60815495
复制相似问题