Идентификатор документа пользователя совпадает с идентификатором пользователя в Firestore

Я пытаюсь хранить пользователей внутри коллекции в 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;
}

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Alex Ali 02.06.2023 13:50
Ответ принят как подходящий

Вы должны обновить 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, см. мой ответ.

Renaud Tarnec 02.06.2023 14:14

@RenaudTarnec, я вижу, ваш ответ будет работать ТОЛЬКО с автоматически сгенерированным идентификатором документа. Но это будет работать со всеми сценариями.

Vishal Thakkar 02.06.2023 14:57

Я не уверен, что понял ваш комментарий. «Сценарий» (то есть требование) OP: «Я хочу создать документ с автоматически сгенерированным идентификатором и сохранить этот идентификатор в самом документе». Ваш ответ соответствует требованиям OP, но подразумевает две записи в Firestore, в то время как есть решение сделать то же самое только с одной записью.

Renaud Tarnec 02.06.2023 15:38

Вызывая метод 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});

Это самый простой и дешевый способ ;)

Alex Mamo 03.06.2023 15:30

Другие вопросы по теме