Flutter Firestore добавление данных

#firebase #flutter #google-cloud-firestore

#firebase #flutter #google-облако-firestore

Вопрос:

Я хочу добавить данные в firestore, и это не сработает. может кто-нибудь мне помочь. Это новейшая обновленная версия, и я не могу понять, как это сделать… firebase_auth: ^0.18.0 1 cloud_firestore: ^0.14.0 2

Это экран регистрации, поэтому я хочу отправить данные после создания адреса электронной почты и пароля. Я тоже хочу добавить документ с идентификатором пользователя.

 onPressed: () async {
                  try {
                    UserCredential userCredential = await FirebaseAuth
                        .instance
                        .createUserWithEmailAndPassword(
                      email: _emailController.text,
                      password: _passwordController.text,
                    );
                    if (userCredential != null) {
                      firestore
                          .collection("user")
                          .doc('user.uid')
                          .set({
                            'username': username,
                            'email': email,
                          })
                          .then((value) => print("User Added"))
                          .catchError((error) =>
                              print("Failed to add user: $error"));
                      Navigator.of(context).pushNamed(AppRoutes.authLogin);
                    }
                  } catch (e) {
                    print(e);
                    _usernameController.text = "";
                    _passwordController.text = "";
                    _repasswordController.text = "";
                    _emailController.text = "";
                    //TODO: alertdialog with error
                  }
                  setState(() {
                    saveAttempted = true;
                  });
                  if (_formKey.currentState.validate()) {
                    _formKey.currentState.save();
                  }
                },
  

Может кто-нибудь помочь мне с firestore.. Спасибо..

Комментарии:

1. используйте if (_formKey.currentState.validate()) { _formKey.currentState.save(); } для завершения остальной части функции… Таким образом, вы сначала сохраняете форму, чтобы можно было опубликовать ее данные

2. чтобы сохранить пользовательский документ по идентификатору пользователя, вам необходимо получить информацию о пользователе из firebase. там у вас будет идентификатор пользователя. Я поделился подробным кодом ниже

Ответ №1:

Сначала создайте пользовательский класс.

   class UserData {
  final String userId;
  final String fullNames;
  final String email;
  final String phone;
  UserData(
      {this.userId,
      this.fullNames,
      this.email,
      this.phone});

  Map<String, dynamic> getDataMap() {
    return {
      "userId": userId,
      "fullNames": fullNames,
      "email": email,
      "phone": phone,
    };
  }
}
  

Затем вы можете использовать функцию, подобную этой, для сохранения учетных данных и сохранения данных в firestore

 createOrUpdateUserData(Map<String, dynamic> userDataMap) async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    DocumentReference ref =
        Firestore.instance.collection('user').document(user.uid);
    return ref.setData(userDataMap, merge: true);
  }
  

==

 bool validateAndSave() {
final form = _formKey.currentState;
if (form.validate()) {
  form.save();
  return true;
}
return false;
 }  

 void validateAndSubmit() async {
        if (validateAndSave()) {
          try {
            String userId = _formType == FormType.login
               ? await widget.auth.signIn(_email, _password)//use your signin
              : await widget.auth.signUp(_email, _password);//use your signup
            if (_formType == FormType.register) {
              UserData userData = new UserData(
                fullNames: _fullNames,
                email: _email,
                phone: "",            
          );
          createOrUpdateUserData(userData.getDataMap());
        }

    } catch (e) {
    setState(() {
      _isLoading = false;
      switch (e.code) {
        case "ERROR_INVALID_EMAIL":
          _authHint = "Your email address appears to be malformed.";
          break;
        case "ERROR_EMAIL_ALREADY_IN_USE":
          _authHint = "Email address already used in a different account.";
          break;
        case "ERROR_WRONG_PASSWORD":
          _authHint = "Your password is wrong.";
          break;
        case "ERROR_USER_NOT_FOUND":
          _authHint = "User with this email doesn't exist.";
          break;
         case "EMAIL NOT VERIFIED":
          _authHint = "Email not verified: Please go to yor email and verify";
          break;
        case "ERROR_USER_DISABLED":
          _authHint = "User with this email has been disabled.";
          break;
        case "ERROR_TOO_MANY_REQUESTS":
          _authHint =
              "Too many Attemps. Account has temporarily disabled.n Try again later.";
          break;
        case "ERROR_OPERATION_NOT_ALLOWED":
          _authHint = "Signing in with Email and Password is not enabled.";
          break;
        case "ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL":
          _authHint = "The email is in use by another account";
          break;
        default:
          _authHint = "An undefined Error happened.";
      }
    });
    print(e);
    errorDialog(context, _authHint);
  }
} else {
  setState(() {
    _authHint = '';
  });
}
  

}

Затем используйте

 onpressed:(){
              validateAndSubmit();
                 }
  

formtype — это перечисление

 enum FormType { login, register, reset }
  

widget.auth.signIn и widget.auth.signUp следует заменить на ваш вход и регистрацию соответственно.

Добавлен пользовательский блок ошибок, чтобы также различать ошибки аутентификации firebase.

Независимое определение страницы аутентификации поможет вам повторно использовать ваш код в будущем.