我正在研究我的 flutter 项目的身份验证部分。 我想在手机未连接互联网时对登录进行异常处理。该应用程序有3个身份验证提供者:电话、GoogleSignIn和电子邮件。对于使用显示错误消息的 FirebaseException 的电话登录和电子邮件登录,错误消息会正确显示。 但是对于 GoogleSignIn,如果设备未连接到互联网,则代码会失败:
final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
由于此时执行失败,我认为 FirebaseAuthException 不起作用,因为 googleSignIn 不支持它。FirebaseAuthException 不起作用,但只有“Exception”起作用。 而且我在警报对话框中使用异常时没有收到正确的错误消息。
带有异常处理的电子邮件登录代码。
Future<void> signInWithEmailAndPassword(
String email,
String password,
void Function(FirebaseAuthException e) errorCallback,
) async {
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: email,
password: password,
);
} on FirebaseAuthException catch (e) {
errorCallback(e);
}
}
在 errorCallback(e) 中调用的错误对话框
void _showErrorDialog(BuildContext context, String title, Exception e) {
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: Text(
title,
style: const TextStyle(fontSize: 24),
),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text(
'${(e as dynamic).message}',
style: const TextStyle(fontSize: 18),
),
],
),
),
actions: <Widget>[
ElevatedButton(onPressed: () {
Navigator.of(context).pop();
},
child: const Text('OK',
style: TextStyle(color: Colors.deepPurple),
),)
],
);
},
);
}
使用 FirebaseAuthException 进行电子邮件的异常处理
使用 FirebaseAuthException 进行电子邮件异常处理
Future<void> signInWithGoogle (
void Function(Exception e) errorCallback,
) async {
try{
final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
final GoogleSignInAuthentication? googleAuth = await googleUser!.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth!.accessToken,
idToken: googleAuth.idToken,
);
await FirebaseAuth.instance.signInWithCredential(credential);
}
on Exception catch (e) {
print(e);
errorCallback(e);
}
}
使用 Exception 而不是 FirebaseAuthException 进行 google 登录的异常处理
控制台打印错误 我/颤振(4383):PlatformException(network_error,com.google.android.gms.common.api.ApiException:7:,null,null)
P.S 我只想在警报对话框中显示正确的网络错误,而不是“ com.google.android.gms.common.api.ApiException: 7”
FirebaseAuthException
处执行失败,因此未调用
GoogleSignIn
,因此无法使用
FirebaseAuthException
。虽然日志中打印的错误是
PlatformException
,但我们可以在try catch块中使用
PlatformException
代替
Exception
,并检查错误代码,因为它受
PlatformException
支持。
错误代码可以与GoogleSignIn.kNetworkError
和
GoogleSignIn.kSignInFailedError
进行比较。
Future<void> signInWithGoogle (
void Function(String errorMessage) errorCallback,
) async {
try {
final GoogleSignInAccount? googleUser = await googleSignIn.signIn();
final GoogleSignInAuthentication? googleAuth = await googleUser!.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: googleAuth!.accessToken,
idToken: googleAuth.idToken,
);
await FirebaseAuth.instance.signInWithCredential(credential);
}
on PlatformException catch (e) {
if (e.code == GoogleSignIn.kNetworkError) {
String errorMessage = "A network error (such as timeout, interrupted connection or unreachable host) has occurred.";
errorCallback(errorMessage);
} else {
String errorMessage = "Something went wrong.";
errorCallback(errorMessage);
}
}
}
解决方案:
确保您有有效的互联网连接,(网络错误表明您没有连接到互联网或没有稳定的网络连接)