Я пытаюсь хранить пользователей внутри коллекции в Firestore в виде документов и хочу, чтобы каждый идентификатор пользователя был таким же, как идентификатор документа. Я пытался, но он все еще дает мне другой идентификатор для пользователя:
Future<void> userSetupDone() async {
CollectionReference users = FirebaseFirestore.instance.collection('Users');
final docUser = FirebaseFirestore.instance.collection('Users').doc();
FirebaseAuth auth = FirebaseAuth.instance;
String? uid = docUser.id;
// String? uid = auth.currentUser?.uid.toString();
String? email = auth.currentUser?.email.toString();
String? phone = auth.currentUser?.phoneNumber.toString();
String? displayName = auth.currentUser?.displayName.toString();
users.add({'Uid': uid, "Email": email, "Phone": phone, "Name": displayName});
return;
}





Future<void> userSetupDone() async {
CollectionReference users = FirebaseFirestore.instance.collection('Users');
String? docId = users.id;
final docUser = FirebaseFirestore.instance.collection('Users').doc(docId);
FirebaseAuth auth = FirebaseAuth.instance;
String? uid = docUser.id;
String? email = auth.currentUser?.email.toString();
String? phone = auth.currentUser?.phoneNumber.toString();
String? displayName = auth.currentUser?.displayName.toString();
users.add({'Uid': uid, "Email": email, "Phone": phone, "Name": displayName});
return;}
попробуй это
Вы должны обновить uid сразу после добавления данных в базу данных. Потому что вы не можете получить идентификатор перед добавлением этих данных из базы данных Firestore.
Вы получите его по следующему коду:
Future<void> userSetupDone() async {
CollectionReference users = FirebaseFirestore.instance.collection('Users');
final docUser = FirebaseFirestore.instance.collection('Users').doc();
FirebaseAuth auth = FirebaseAuth.instance;
String? email = auth.currentUser?.email.toString();
String? phone = auth.currentUser?.phoneNumber.toString();
String? displayName = auth.currentUser?.displayName.toString();
DocumentReference reference= await users.add({'Uid': '', "Email": email, "Phone": phone, "Name": displayName});
await reference.update({"Uid": reference.id});
return;
}
Хотя это решение действительно работает, оно предполагает ненужную операцию записи, которая имеет свою стоимость. На самом деле вы можете сгенерировать идентификатор документа перед созданием соответствующего документа в Firestore, см. мой ответ.
@RenaudTarnec, я вижу, ваш ответ будет работать ТОЛЬКО с автоматически сгенерированным идентификатором документа. Но это будет работать со всеми сценариями.
Я не уверен, что понял ваш комментарий. «Сценарий» (то есть требование) OP: «Я хочу создать документ с автоматически сгенерированным идентификатором и сохранить этот идентификатор в самом документе». Ваш ответ соответствует требованиям OP, но подразумевает две записи в Firestore, в то время как есть решение сделать то же самое только с одной записью.
Вызывая метод add() в
users.add({'Uid': uid, "Email": email, "Phone": phone, "Name": displayName});
return;
}
вы фактически создаете новый документ с автоматически сгенерированным идентификатором, и поэтому его идентификатор отличается от того, который вы получили через String? uid = docUser.id;.
Поэтому вам нужно использовать метод set() для созданного вами DocumentReference (то есть docUser) следующим образом:
await docUser.set({'Uid': uid, "Email": email, "Phone": phone, "Name": displayName});
Это самый простой и дешевый способ ;)
он напечатал: «Пользователи» в UiD