如何在Flutter中将Future变量分配给类getter

时间:2020-05-07 20:52:42

标签: firebase flutter dart future

我正在尝试通过Streamer从Firebase读取用户数据,并将其分配到我的User类的属性中。我有一个FirabaseActions类在做Firebase的东西。这是我使用拖缆获取数据的方法。它可以完美工作,并且可以打印(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 个答案:

答案 0 :(得分:1)

第一个问题是您不能分配这样的用户名

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作为方法的参数,或将其保留在方法中。