Как назначить переменную Future геттеру класса во Flutter - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь прочитать пользовательские данные из Firebase через Streamer и назначить их свойствам моего класса User. У меня есть класс FirabaseActions, выполняющий работу с firebase. Вот метод, который я использую для получения данных. Работает отлично, и print (user.data ['userName']); дайте мне правильный результат.

static Future<User> userDataStream(loggedInUserEmail) async {
    final databaseReference = Firestore.instance;
    User currentUser;

    await for (var snapshot in databaseReference
        .collection('users')
        .where('email', isEqualTo: loggedInUserEmail)
        .snapshots()) {
      for (var user in snapshot.documents) {
        print(user.data['userName']);
        currentUser.userName = user.data['userName'];
        currentUser.email = user.data['email'];
        currentUser.userID = user.data['userID'];
        currentUser.level = user.data['level'];
      }
    }
    return currentUser;
  }

Проблема начинается, когда я пытаюсь назначить эту информацию о пользователе свойствам моего класса. Вот мой класс User. У меня ошибка, как показано ниже. Речь идет о типе будущего, но я не могу с этим справиться. Что мне делать?

Класс «Future» не имеет экземпляра получателя «email». Получатель: Экземпляр "Будущее" Пытался позвонить: электронная почта

class User {
  String userName;
  String userID;
  String email;
  int level;

  User({this.userName, this.userID, this.level, this.email});
}

1 Ответ

1 голос
/ 08 мая 2020

Первая проблема заключается в том, что вы не можете назначить имя пользователя, подобное этому

currentUser.userName = user.data['userName'];, потому что currentUser имеет значение null. Простое решение - заменить
User currentUser; на User currentUser = User();

Вторая проблема:

Я думаю, вы никогда не должны искать пользователя по его электронной почте, а скорее по UID, который вы получить от

FirebaseUser user = await FirebaseAuth.instance.currentUser(),

Итак, вы должны запросить пользователя следующим образом:

  static Future<User> userDataStream() async {
    final firestore = Firestore.instance;
    final currentFirestoreUser = await FirebaseAuth.instance.currentUser();
    User currentUser;

    var query = await firestore
        .collection('users')
        .where('uid', isEqualTo: currentFirestoreUser.uid)
        .getDocuments();
    var user = query.documents.first.data;
    currentUser = User(
        userName: user['userName'],
        userID: user['userID'],
        level: user['level'],
        email: user['email']);

    return currentUser;
  }

Вы можете добавить UID в качестве параметра метода или оставить его внутри метод.

...