Проблема с чтением пользовательских данных из Firebase

#firebase #flutter #google-cloud-firestore #firebase-authentication

#firebase #флаттер #google-облако-firestore #firebase-аутентификация

Вопрос:

На рисунке ниже показано, как структурирована моя база данных. Каждый класс модели является коллекцией верхнего уровня.

как структурирована моя firebase

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

Я вставил свою модель класса UserData и класс Notifier ниже, чтобы вы могли видеть, что я сделал.

Что я мог пропустить, пожалуйста, в моем getUserData()? Или я все делаю неправильно? Может кто-нибудь показать мне лучший способ добиться чтения текущих зарегистрированных пользовательских данных из Firebase?

 class User {
 final String uid;
 final String email;
 final String password;
 User({this.uid, this.email, this.password});
}

class UserData {
  String id;
  String firstName;
  String lastName;
  String phoneNumber;
  String role;
  String businessName;
  String businessType;
  String streetAddress;
  String city;
  String state;
  String postcode;
  String country;
  Timestamp createdAt;
  Timestamp updatedAt;
  UserData(
    this.id,
    this.firstName,
    this.businessType,
    this.businessName,
    this.city,
    this.country,
    this.createdAt,
    this.lastName,
    this.phoneNumber,
    this.postcode,
    this.role,
    this.state,
    this.streetAddress,
    this.updatedAt,
  );
  UserData.fromMap(Map<String, dynamic> data) {
    id = data['id'];
    firstName = data['first_name'];
    lastName = data['last_name'];
    phoneNumber = data['phone_number'];
    role = data['role'];
    businessName = data['business_name'];
    businessType = data['business_type'];
    streetAddress = data['street_address'];
    city = data['city'];
    postcode = data['postcode'];
    state = data['state'];
    country = data['country'];
    createdAt = data['created_at'];
    updatedAt = data['updated_at'];
  }
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'first_name': firstName,
      'last_name': lastName,
      'phone_number': phoneNumber,
      'role': role,
      'business_name': businessName,
      'business_type': businessType,
      'street_address': streetAddress,
      'city': city,
      'postcode': postcode,
      'state': state,
      'country': country,
      'created_at': createdAt,
      'updated_at': updatedAt,
    };
  }
}
  

//Класс UserDataNotifier

 class UserDataNotifier with ChangeNotifier {

  UserData _currentLoggedInUserData;

  CollectionReference userDataRef = Firestore.instance.collection('userData');

  UserData get currentLoggedInUserData => _currentLoggedInUserData;

  Future<UserData> getUserData() async {
    String userId = (await FirebaseAuth.instance.currentUser()).uid;
    DocumentSnapshot variable =
        await Firestore.instance.collection('userData').document(userId).get();
    _currentLoggedInUserData = variable.data as UserData;
    notifyListeners();
  }

  Future createOrUpdateUserData(UserData userData, bool isUpdating) async {
    String userId = (await FirebaseAuth.instance.currentUser()).uid;
    if (isUpdating) {
      userData.updatedAt = Timestamp.now();
      await userDataRef.document(userId).updateData(userData.toMap());
      print('updated userdata with id: ${userData.id}');
    } else {
      userData.createdAt = Timestamp.now();
      DocumentReference documentReference = userDataRef.document(userId);
      userData.id = documentReference.documentID;
      await documentReference.setData(userData.toMap(), merge: true);
      print('created userdata successfully with id: ${userData.id}');
    }
    notifyListeners();
  }
}
  

Ответ №1:

 _currentLoggedInUserData = variable.data() as UserData; 
  

вызов переменной.данные как переменная.data()

если не работает,

 UserData.fromMap(Map<String, dynamic> data) => UserData(
    id: data['id'];
    firstName: data['first_name'];
    lastName: data['last_name'];
    phoneNumber: data['phone_number'];
    role: data['role'];
    businessName: data['business_name'];
    businessType: data['business_type'];
    streetAddress: data['street_address'];
    city: data['city'];
    postcode: data['postcode'];
    state: data['state'];
    country: data['country'];
    createdAt: data['created_at'];
    updatedAt: data['updated_at'];
  })

_currentLoggedInUserData = UserData.fromMap(variable.data());