Flitster Firestore Проблема: невозможно сохранить данные формы регистрации в Cloud Firestore DB, вместо этого сохраняются жестко закодированные данные - PullRequest
0 голосов
/ 21 января 2020

Класс DatabaseService

class DatabaseService {

  final String uid;
  DatabaseService({this.uid});

 //collection reference
  final CollectionReference agentsCollection = 
        Firestore.instance.collection('agents');

 Future updateUserData( 
                        String fullname, 
                        String phonenumber, 
                        String email, 
                        String profession, 
                        String city
                      ) 
async {
   return await agentsCollection.document(uid).setData({

       'fullname': fullname,
       'phonenumber': phonenumber,
       'email': email,
       'profession': profession,
       'city': city,


    });
   }

Класс AuthService

class AuthService {

final FirebaseAuth _auth = FirebaseAuth.instance;

//create user object based on FirebaseUser
User _userFromFirebaseUser(FirebaseUser user) {
  return user != null ? User(uid: user.uid) : null;
}

//auth change user stream
Stream<User> get user {
  return _auth.onAuthStateChanged
      .map(_userFromFirebaseUser);
}

Then I have a function to Register the user in this class as below:

//Register with email and password

Future registerWithEmailAndPassword(String email, String password) async {

  try{

     AuthResult result = await _auth.createUserWithEmailAndPassword
     (email: email, password: password);   
     FirebaseUser user = result.user;

//create a new document for the user with the uid
     await DatabaseService(uid: user.uid).updateUserData( 'hardcoded Name', 
     'Hardcoded Number','hardcoded email', 'hardcoded profession', 'hardcoded city'); 

     return _userFromFirebaseUser(user);

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

  }
}

Класс регистрации

В этом классе я вызываю пользователя (uid), используя сервис провайдера. Затем я использую функцию из класса AuthService, которая использует функцию из класса DatabaseService, чтобы создать новый документ в базе данных. закодированные данные из класса AuthService и не выполняющие строку в классе SignUp под функцией onPressed (); где я говорю, чтобы использовать функцию updateUserData и сохранить this.email, this.fullname, et c. Также важно отметить, что в классе SignUp говорится, что возвращен нулевой пользователь (при условии, что uid).

Пожалуйста, кто-нибудь поможет мне, если вы поймете, что я делаю неправильно в этом контексте.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Эй, @ Гриффо, я использовал этот код в функции onPressed:

dynamic result = await _auth.registerWithEmailAndPassword
        (email, password).then((user) {    
        DatabaseService (uid: user.uid).updateUserData(this.fullname, 
        this.phonenumber, this.email, this.profession, this.city);
         });     

и теперь он работает! я использовал эту логику c из вашего кода onPressed. Спасибо!

0 голосов
/ 21 января 2020

Я думаю, что при разборе данных остаются жестко закодированные данные. Вот пример того, как это исправить.

создать пользователя obj

class User {
  final String userID;
  final String displayName;
  final String email, pushToken;
  final String phoneNumber;
  final String profilePictureURL;

  User({
    this.phoneNumber,
    this.userID,
    this.pushToken,
    this.displayName,
    this.email,
    this.profilePictureURL,
  });

  Map<String, Object> toJson() {
    return {
      'pushToken': pushToken,
      'phoneNumber': phoneNumber,
      'userID': userID,
      'displayName': displayName,
      'email': email == null ? '' : email,
      'profilePictureURL': profilePictureURL,
      'appIdentifier': 'my app'
    };
  }

  factory User.fromJson(Map<String, Object> doc) {
    User user = new User(
      pushToken: doc['pushToken'],
      userID: doc['userID'],
      displayName: doc['displayName'],
      phoneNumber: doc['phoneNumber'],
      email: doc['email'],
      profilePictureURL: doc['profilePictureURL'],
    );
    return user;
  }

  factory User.fromDocument(DocumentSnapshot doc) {
    return User.fromJson(doc.data);
  }
}

, а затем метод регистрации

//user sign up
     static Future<String> signUp(String email, String password) async {
        final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
        FirebaseUser user = (await _firebaseAuth.createUserWithEmailAndPassword(
                email: email, password: password))
            .user;

        return user.uid;
      }
 //if user id doesnt exist add user 
    static void addUser(User user) async {
        checkUserExist(user.userID).then((value) {
          if (!value) {
            print("user ${user.displayName} ${user.email} added");

            Firestore.instance
                .document("users/${user.userID}")
                .setData(user.toJson());

            Fluttertoast.showToast(
                msg: "user ${user.displayName} ${user.email} added");
          } else {
            print("user ${user.displayName} ${user.email} exists");
          }
        });
      }
//check if user exists    
      static Future<bool> checkUserExist(String userID) async {
        bool exists = false;
        try {
          await Firestore.instance.document("users/$userID").get().then((doc) {
            if (doc.exists)
              exists = true;
            else
              exists = false;
          });
          return exists;
        } catch (e) {
          return false;
        }
      }

и обработать вашу кнопку onPressed : и он сохранит ваши данные в firestore

await signUp(email, password).then((uID) {
          addUser(new User(
              userID: uID,
              email: email,
              displayName: fullname,
              phoneNumber: number,
              pushToken: pushToken,
              profilePictureURL: ''));
...