我在FlatterFirebase登录时遇到一些问题
我正在为我的公司编写一个应用程序,我尝试将firebase身份验证添加到我的应用程序中,用于登录和注册。该应用程序未显示任何错误,并已成功运行 但当用户试图用错误的电子邮件和密码登录时,它显示的是一个内部颤振错误,而不是我编写的toast。此外,我还使用共享首选项让用户保持登录状态 因此,当用户试图使用错误的凭据登录时,它会显示内部颤振错误,当应用程序重新打开时,它不会进入登录屏幕,而是使用错误的凭据并将用户导航到主屏幕,这是荒谬的 以下是声明的变量:我在FlatterFirebase登录时遇到一些问题,firebase,flutter,firebase-authentication,Firebase,Flutter,Firebase Authentication,我正在为我的公司编写一个应用程序,我尝试将firebase身份验证添加到我的应用程序中,用于登录和注册。该应用程序未显示任何错误,并已成功运行 但当用户试图用错误的电子邮件和密码登录时,它显示的是一个内部颤振错误,而不是我编写的toast。此外,我还使用共享首选项让用户保持登录状态 因此,当用户试图使用错误的凭据登录时,它会显示内部颤振错误,当应用程序重新打开时,它不会进入登录屏幕,而是使用错误的凭据并将用户导航到主屏幕,这是荒谬的 以下是声明的变量: final FirebaseAuth fi
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
final _formKey = GlobalKey<FormState>();
TextEditingController _emailcontroller = TextEditingController();
TextEditingController _passwordcontroller = TextEditingController();
bool passvis = true;
bool loading = false;
注册代码如下:
Future validateForm() async {
FormState formSate = _formKey.currentState;
if (formSate.validate()) {
final User firebaseUser = (await firebaseAuth
.createUserWithEmailAndPassword(
email: _emailcontroller.text,
password: _passwordcontroller.text)
.catchError((errMsg) {
displayToast("Error: " + errMsg.toString(), context);
}))
.user;
if (firebaseUser != null) {
Map userDataMap = {
"name": _namecontroller.text.trim(),
"email": _emailcontroller.text.trim(),
"phone": _phonecontroller.text.trim(),
};
usersRef.child(firebaseUser.uid).set(userDataMap);
displayToast("Succesfully Registered!", context);
Navigator.pushReplacement(context,
MaterialPageRoute(builder: (context) {
return LocationHome();
}));
} else {
displayToast("User was unable to create", context);
}
}
}
}
main.dart文件的编码也正确:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
SharedPreferences preferences = await SharedPreferences.getInstance();
var circle = preferences.getString("circle");
runApp(MaterialApp(
title: 'TaakStore',
home: circle == null ? Login() : Home(),
));
}
DatabaseReference usersRef =
FirebaseDatabase.instance.reference().child("users");
不要担心
displaytoos
功能。这是一个使用颤振toast手动创建的函数。要显示toast,请尝试以下操作:
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: _emailcontroller.text,
password: _passwordcontroller.text
);
} on FirebaseAuthException catch (e) {
displayToast("Error: " + e.message.toString(), context);
print(e.message);
}
FirebaseAuth.instance
.authStateChanges()
.listen((User user) {
if (user == null) {
print('User is currently signed out!');
} else {
print('User is signed in!');
}
});
要检查用户是否已登录,请使用以下命令:
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: _emailcontroller.text,
password: _passwordcontroller.text
);
} on FirebaseAuthException catch (e) {
displayToast("Error: " + e.message.toString(), context);
print(e.message);
}
FirebaseAuth.instance
.authStateChanges()
.listen((User user) {
if (user == null) {
print('User is currently signed out!');
} else {
print('User is signed in!');
}
});
authStateChanges()
属于Stream
类型,它将侦听用户状态的任何更改。因此,如果用户登录,它将返回一个有效的用户对象,您可以导航到主屏幕。因此,无需使用共享首选项。来显示祝酒词
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: _emailcontroller.text,
password: _passwordcontroller.text
);
} on FirebaseAuthException catch (e) {
displayToast("Error: " + e.message.toString(), context);
print(e.message);
}
检查用户是否已登录
//inside the main.dart in the "MaterialApp" widget
MaterialApp(home:buildHome(),)
buildHome(){return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
if (snapshot.hasData) {
print(snapshot);
//if the user is logged in return what you want
return "";
} else {
//else return what you want also
return"";
}
},
);}
//在“MaterialApp”小部件的main.dart内
MaterialApp(主页:buildHome(),)
buildHome(){返回StreamBuilder(
流:FirebaseAuth.instance.authStateChanges(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
打印(快照);
//如果用户登录,则返回您想要的内容
返回“”;
}否则{
//否则,你也要归还你想要的东西
返回“”;
}
},
);}
代码正常,但仍然存在问题。如果snapshot.hasdata,则应返回我的主屏幕;如果没有数据,则应返回登录屏幕。当用户未登录时,将显示登录屏幕。在上面的问题中,您可以看到,在登录页面后,应该路由到位置屏幕。但在路由之后,它直接进入主屏幕,因为设置了快照值
下面是我如何安排main.dart文件的问题:有一个错误,但这不是问题所在,而不是main.dart中的圆圈。这是电子邮件,登录功能中有一个共享首选项,但在何处添加这些firebase.instace和AuthStateChange在main.dart中添加它,创建一个streambuilder小部件,该小部件将调用方法authStatechange,并根据结果导航到特定页面谢谢,你能用你的代码重新排列我的代码吗..我完全困惑了好的,它可以工作…以及如何注销..兄弟,一切都很好,不用担心..但也请说出注销的功能。还有如何显示自定义toast而不是显示firebase制作的errorNoo。我想问题再次出现了,它不符合登录功能。当按下登录时,它将进入主屏幕,这不是我想要的