flutter & firebase:身份验证出现多个错误

时间:2021-06-10 17:51:24

标签: firebase flutter dart firebase-authentication

我正在为用户创建/日志,但我有多个错误,这是我的代码,在我的错误之后: 登录控制器.dart :

  String? _mail;
  String? _password;
  String? _prenom;
  String? _nom;

  _handlelog(){
    if(_mail != null){
      if(_password != null){
        if(_log == true){
          //se connecter
          FirebaseHelper().handleSignIn(_mail, _password).then(((User user) {
            print("Nous avons un user");
          })).catchError((error){
            alerte(error.toString());
          });
        }else{
          if(_prenom != null){
            if(_nom != null){
              //créer un compte avec les données de l'utilisateur
              FirebaseHelper().handleCreate(_mail, _password, _prenom, _nom).then(((User user) {
                print("Nous avons pu créer un user");
              })).catchError((error){
                alerte(error.toString());
              });
            }else{
              //Alert nom
              alerte("veuillez entrer un nom pour continuer");
            }
          }else{
            //Alert prenom
            alerte("veuillez entrer un prenom pour continuer");
          }
        }
      }else{
        //Alert password
        alerte("le mot de passe est vide");
      }
    }else{
      //Alert mail
      alerte("l'adresse mail est vide");
    }
  }

FirebaseHelper.dart :

class FirebaseHelper {

  //Authentification
  final auth = FirebaseAuth.instance;

  Future<UserCredential> handleSignIn(String mail, String password) async{
    final UserCredential user = await auth.signInWithEmailAndPassword(email: mail, password: password);
    return user;
  }

  Future<UserCredential> handleCreate(String mail, String password, String prenom, String nom) async{
    final UserCredential credential = await FirebaseAuth.instance.createUserWithEmailAndPassword(email: mail, password: password);
    String uid = credential.user!.uid;
    Map<String, String> map = {
      "uid" : uid,
      "prenom" : prenom,
      "nom" : nom,
    };
    addUser(uid, map);
    return credential;
  }

  //database

  static final base = FirebaseDatabase.instance.reference();
  // ignore: non_constant_identifier_names
  final base_user = base.child("users");

  addUser(String uid, Map map){
    base_user.child(uid).set(map);
  }

}

在 LoginController.dart 我有 The argument type 'String?' can't be assigned to the parameter type 'String'. The argument type 'Null Function(User)' can't be assigned to the parameter type 'FutureOr<dynamic> Function(UserCredential)'. 我不知道我能做什么,我在文档上搜索了很长时间,在这个网站上找到了更多细节,但我什么也没找到,我很绝望

2 个答案:

答案 0 :(得分:0)

我用过这个,也许会有帮助

class AuthServices {
final FirebaseAuth _auth = FirebaseAuth.instance;
  //Create user object based on firebase user
  UserData _userFromFirebaseUser(User user) {
    return user != null ? UserData(uid: user.uid, email: user.email) : null;
  }

  //Auth change user stream
  Stream<UserData> get uservalue {
    return _auth.authStateChanges().map((User uservalue) => _userFromFirebaseUser(uservalue));
  }


  // Sign In with email & password
  Future sigInUser(String email, String password) async {
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
      User userval = result.user;

      return _userFromFirebaseUser(userval);

    }

    catch(e) {
      print(e.toString());
      return null;
    }
  }

  // Register with email & password
  Future registerUser(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      User userval = result.user;

      return _userFromFirebaseUser(userval);

    }
    catch(e) {
      print(e.toString());
    }

  }
}

答案 1 :(得分:0)

<块引用>

错误 1:

参数类型“字符串?”不能分配给参数类型 '字符串'。

显示上面的错误是因为 _mail_password_prenom_nom 属于 String? 类型,这意味着它们可以为 null 而参数为FirebaseHelper().handleCreate() 方法属于 String 类型,与 String? 不同。

<块引用>

后缀感叹号 (!) 使用左侧的表达式并 将其强制转换为其底层不可为空类型

https://dart.dev/null-safety/understanding-null-safety#null-assertion-operator

因此添加 ! 会将 String? 对象强制转换为类型 String

<块引用>

错误 2:

不能将参数类型“Null Function(User)”分配给 参数类型“FutureOr 函数(UserCredential)”。

上述错误的原因是 FirebaseHelper().handleCreate() 返回 Future<UserCredential> 类型,但您在 User 文件中使用 LoginController.dart 作为类型。

解决方案:

您需要更新这部分代码:

FirebaseHelper().handleCreate(_mail, _password, _prenom, _nom).then(((User user) {

为此:

FirebaseHelper().handleCreate(_mail!, _password!, _prenom!, _nom!).then(((UserCredential user) {