FIrestore Query Document в коллекции с использованием одного поля / атрибута во флаттере - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь получить роль аутентифицированного пользователя, сохраненного в users collection. Я пытаюсь достичь во время входа в систему запроса к роли пользователя путем обхода выборки документа пользователя в коллекции и просеивания через поля или проверки всех документов и возврата поля role в виде строки.

Снимок коллекции и документа (извините за терминологию): enter image description here

Все документы в users collection на данный момент имеют одинаковые поля.

Пожалуйста, как мне go о написании этого типа запроса во флаттере? Я пытался использовать AuthResult в своем сервисе и FirebaseAuth, чтобы получить текущего пользователя (но не смог получить доступ к полям в документе). Спасибо.

String role;

getUserRoleWithFuture() async {
String currID = await _authService.getCurrentUID();
String mRole;
Firestore.instance.collection(USERS_REF).document(currID).get().then((doc) {
  mRole = doc.data['role'];
  print(mRole);
});
return mRole;
}

Future<String> getUserRoleWithStream() async {
String currID = await _authService.getCurrentUID();
String sRole;
Firestore.instance
    .collection(USERS_REF)
    .document(currID)
    .snapshots()
    .listen((DocumentSnapshot ds) {
  if (ds.exists) {
    sRole = ds.data['role'];
    print('with stream:\t$sRole');
  }
});
return sRole;
}

В методе getUserRoleWithStream() Я пытаюсь получить распечатанное значение как role = getUserRoleWithStream(), но вместо этого получаю это в консоли a value of type Future<String> can't be assigned to a variable of type string.

Как мне получить это значение, используя либо поток (потому что он постоянно наблюдает за коллекцией), либо используя другой метод и использовать его в моем виджете? Еще раз спасибо.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Это рабочее решение, на случай, если кто-нибудь еще столкнется с этим. Я ценю усилия, которые помогли мне понять проблему, но вот ответ:

String role;

getUserRoleWithFuture() async {
  String currID = await _authService.getCurrentUID();
  String mRole;
  Firestore.instance.collection(USERS_REF).document(currID).get().then((doc) {
    mRole = doc.data['role'];
    print(mRole);
   });
   return mRole;
 }

Future<String> getUserRoleWithStream() async {
  String currID = await _authService.getCurrentUID();
  String sRole;
  Firestore.instance
    .collection(USERS_REF)
    .document(currID)
    .snapshots()
    .listen((DocumentSnapshot ds) {
     if (ds.exists) {
       sRole = ds.data['role'];
       print('with stream:\t$sRole');
     }
   });
   return sRole;
 }
0 голосов
/ 07 февраля 2020

Ну, во-первых, я предполагаю, что AuthResult.user.uid и идентификатор пользователя коллекции вашего пользователя совпадают. Таким образом, если у вас есть пользователь из AuthResult, вы можете запросить свою коллекцию пожарных, чтобы получить роль пользователя следующим образом.

Future<String> getUserRole(String uid) async {
    DocumentSnapshot ds = await Firestore.instance.collection('users').document(uid).get();
    return ds.data['role'];
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...