我正在使用Ionic 3和Firebase作为身份验证提供程序开发混合应用程序。该应用程序包含2页。登录页面和主页。在登录页面上有一个按钮,使用电子邮件+密码登录用户,在主页上另一个按钮注销当前用户。基本上,第一次加载应用程序一切正常。但是在登录后然后登出然后再次登录onAuthStateChange中的函数被调用两次,然后是三次,然后是五次,依此类推斐波那契的系列。 这是登录页面代码:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
console.log('User logged-in');
if (user.emailVerified) {
self.goToHome();
} else {
self.showAlert();
firebase.auth().signOut();
}
}
});
}
这是注销码:
firebase.auth().onAuthStateChanged(function(user) {
if (user == null) {
console.log('User logged-out');
navCtrl.push(WelcomePage);
}
});
chrome控制台显示此行为:
(因为我使用了错误的密码,图片末尾的错误是我的错误)
按钮调用的函数(但我99%确定问题是onAuthStateChanged):
doLogin() {
console.log('Trying to log in...');
var email = this.account.email;
var password = this.account.password;
if (this.validateEmail(email) && password.length >= 8) {
loading.present();
firebase.auth().signInWithEmailAndPassword(email, password)
.then(function(data) {
loading.dismiss();
});
}
logout() {
firebase.auth().signOut();
}
goToHome函数将用户移动到主页:
goToHome() {
this.navCtrl.push(MainPage);
}
Ben在评论中指出的解决方案:
1:从onAuthStateChanged移动所有navController相关的函数 2:使用setRoot而不是pop()和push()
goToHome() {
this.navCtrl.setRoot(HomePage);
}
logout() {
firebase.auth().signOut();
this.navCtrl.setRoot(WelcomePage);
}
3)要修复能够自动登录用户,如果他/她没有注销我检查 如果firebase.auth()。currentuser存在,但使用超时因为 Firebase需要一段时间才能正常运行:
setTimeout(function(){
var user = firebase.auth().currentUser;
if (user != null) {
self.goToHome();
}
}, 1500);
答案 0 :(得分:0)
您应该将用户发送到firebase.auth().signInWithEmailAndPassword(email, password)
之后的页面,而不是发送者。 Firebase监听器有一种奇怪的行为......
试试这个:
doLogin() {
console.log('Trying to log in...');
var email = this.account.email;
var password = this.account.password;
if (this.validateEmail(email) && password.length >= 8) {
loading.present();
firebase.auth().signInWithEmailAndPassword(email, password).then(function(data) {
loading.dismiss();
var user = firebase.auth().currentUser;
if (user) {
console.log('User logged-in');
if (user.emailVerified) {
self.goToHome();
} else {
self.showAlert();
firebase.auth().signOut();
}
} else {
// No user is signed in.
}
}, function(error) {
//error handling
});
}
}
答案 1 :(得分:0)
我的登录时遇到了类似的问题。每次身份验证状态发生变化时,函数/侦听器firebase.auth().onAuthStateChanged(
都会触发,我预计onAuthStateChanged
代码中的问题会出现firebase.auth().signOut();
,这会触发新的onAuthStateChanged
...导致奇怪的初始行为。
您已将firebase.auth().signOut();
放入退出按钮,我建议您从登录页面上的firebase.auth().signOut();
删除onAuthStateChanged
,然后我预计斐波纳契会停止(但您真的想要吗?它要停止吗?)
如果有任何结果,请告诉我。希望它有所帮助,
答案 2 :(得分:0)
我看到你正在推送onAuthStateChanged
中的页面。这可能会导致问题。
onAuthStateChanged login
您推送1个新主页onAuthStateChanged logout
,您推送1个新登录页面(因此您点击后加载了2个登录页面和2个onAuthStateChanged login
)onAuthStateChanged login
,所以这会导致3个登出页面加载,3个onAuthStateChanged logout
< / LI>
onAuthStateChanged logout
,从而创建3个新登录页面+ 2个现有登录页面= 5 要测试是否是这种情况,您可以开始使用登录页面加载您的模块,当您登录时推送主页,当您注销时,请不要按下登录页面popToRoot()
希望这有帮助,