#firebase #flutter #google-cloud-firestore #firebase-authentication
#firebase #флаттер #google-облако-firestore #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());