wcy*_*424 4 firebase firebase-authentication flutter
我知道这个问题已经被问了很多,我花了很多时间阅读并尝试实现答案。所以我试图让isEmailVerifiedFirebase Auth的响应工作并且它确实工作但现在它总是返回 false 除非我刷新应用程序或关闭它并重新打开它。这显然是一种糟糕的用户体验。如何在无需关闭应用程序的情况下获得更新响应。
这是相关的代码片段。
Future<bool> isEmailVerified() async {
FirebaseUser user = await _auth.currentUser();
if (user == null) {
return false;
} else {
await user.reload();
user = await _auth.currentUser();
return user.isEmailVerified;
}
}
Run Code Online (Sandbox Code Playgroud)
main.dart
child: Consumer<Auth>(
builder: (_, auth, __) => MaterialApp(
theme: Provider.of<ThemeNotifier>(context).getTheme(),
home: FutureBuilder(
future: Future.wait([auth.isEmailVerified(), auth.tryAutoLogin()]),
builder: (BuildContext ctx, AsyncSnapshot authResultSnapshot) =>
authResultSnapshot.connectionState == ConnectionState.done
? authResultSnapshot.data[1]
? authResultSnapshot.data[0]
? HearingsScreen()
: SplashScreen(
emailVerified: true,
)
: LoginScreen()
: SplashScreen(),
),
Run Code Online (Sandbox Code Playgroud)
在我重新启动应用程序之前它不会返回 true
除了这个之外我还尝试过的事情:
1)await user.getIdToken(refresh: true);
2)将用户注销然后重新登录
3)firebase_user_stream 包
任何帮助表示赞赏。
我已经使用以下代码在初始屏幕中实现了相同的场景,您可以根据需要进行更改。:
//To check is User is logged in
Future<bool> isLoggedIn() async {
FirebaseUser user = await _fireBaseAuth.currentUser();
if (user == null) {
return false;
}
return user.isEmailVerified;
}
Run Code Online (Sandbox Code Playgroud)
和
countDownTime() async {
return Timer(
Duration(seconds: splashDuration),
() async {
if (await userAuth.isLoggedIn()) {
Navigator.pushReplacement(
context,
ScaleRoute(
widget: HomeScreen(),),
);
}
} else {
Navigator.pushReplacement(
context,
ScaleRoute(
widget: LoginScreen(),),
);
}
},
);
}
Run Code Online (Sandbox Code Playgroud)
和
@override
void initState() {
super.initState();
countDownTime();
}
Run Code Online (Sandbox Code Playgroud)
更新
一需要定期在 initState() 函数中实现 isEmailVerified ,这可能是使用 firebase 执行验证的理想方法。
bool _isUserEmailVerified;
Timer _timer;
@override
void initState() {
super.initState();
// ... any code here ...
Future(() async {
_timer = Timer.periodic(Duration(seconds: 10), (timer) async {
await FirebaseAuth.instance.currentUser()..reload();
var user = await FirebaseAuth.instance.currentUser();
if (user.isEmailVerified) {
setState((){
_isUserEmailVerified = user.isEmailVerified;
});
timer.cancel();
}
});
});
}
@override
void dispose() {
super.dispose();
if (_timer != null) {
_timer.cancel();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5298 次 |
| 最近记录: |