我们目前正在构建一个仅需要 google 登录并根据登录时获得的数据与 Firebase 进行通信的应用程序。
问题是这样的;登录应用程序后,如果用户丢失互联网连接,然后在不关闭应用程序的情况下重新建立该连接,FirebaseAuth.currentUser不为空,但同时用户未经过身份验证,因此我需要通信的功能与数据库不起作用。
我的问题很简单;
我如何检查身份验证,然后重新对用户进行身份验证。
我的登录方法如下,每次用户进入某些特定页面时我都尝试重新登录,但这看起来不太好,但确实解决了问题。有没有优化的方法?
Future<String> signInWithGoogle() async {
// Trigger the authentication flow
final GoogleSignInAccount? googleUser = await _googleSignIn!.signIn();
// Obtain the auth details from the request
final GoogleSignInAuthentication? googleAuth =
await googleUser!.authentication;
// Create a new credential
final GoogleAuthCredential credential = (GoogleAuthProvider.credential(
accessToken: googleAuth!.accessToken,
idToken: googleAuth.idToken,
) as GoogleAuthCredential);
// Once signed in, return the UserCredential
final UserCredential? authResult =
await _auth!.signInWithCredential(credential);
final User? user = authResult!.user;
//assert(user!.isAnonymous);
assert(await user!.getIdToken() != null);
final User? currentUser = _auth!.currentUser;
assert(user!.uid == currentUser!.uid);
return 'signInWithGoogle succeeded: $user';
}
编辑:
我们使用connectivity_plus插件,因此我们为其创建了一个侦听器,如果用户更改其与wifi或移动设备的连接,我们只需重新登录即可。它对我们有用,也许对你也有用;
@override
void initState() {
subscription = Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) {
if (result == ConnectivityResult.mobile ||
result == ConnectivityResult.wifi ||
result == ConnectivityResult.ethernet) {
Login().signInWithGoogle();
}
print("${result}");
});
// TODO: implement initState
super.initState();
}
dispose() {
super.dispose();
subscription.cancel();
}