Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在FlatterFirebase登录时遇到一些问题_Firebase_Flutter_Firebase Authentication - Fatal编程技术网

我在FlatterFirebase登录时遇到一些问题

我在FlatterFirebase登录时遇到一些问题,firebase,flutter,firebase-authentication,Firebase,Flutter,Firebase Authentication,我正在为我的公司编写一个应用程序,我尝试将firebase身份验证添加到我的应用程序中,用于登录和注册。该应用程序未显示任何错误,并已成功运行 但当用户试图用错误的电子邮件和密码登录时,它显示的是一个内部颤振错误,而不是我编写的toast。此外,我还使用共享首选项让用户保持登录状态 因此,当用户试图使用错误的凭据登录时,它会显示内部颤振错误,当应用程序重新打开时,它不会进入登录屏幕,而是使用错误的凭据并将用户导航到主屏幕,这是荒谬的 以下是声明的变量: final FirebaseAuth fi

我正在为我的公司编写一个应用程序,我尝试将firebase身份验证添加到我的应用程序中,用于登录和注册。该应用程序未显示任何错误,并已成功运行

但当用户试图用错误的电子邮件和密码登录时,它显示的是一个内部颤振错误,而不是我编写的toast。此外,我还使用共享首选项让用户保持登录状态

因此,当用户试图使用错误的凭据登录时,它会显示内部颤振错误,当应用程序重新打开时,它不会进入登录屏幕,而是使用错误的凭据并将用户导航到主屏幕,这是荒谬的

以下是声明的变量:

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。我想问题再次出现了,它不符合登录功能。当按下登录时,它将进入主屏幕,这不是我想要的