【问题标题】:How to assign a Future variable to a class getter in Flutter如何将 Future 变量分配给 Flutter 中的类 getter
【发布时间】:2020-08-23 07:48:28
【问题描述】:

我正在尝试通过 Streamer 从 Firebase 读取用户数据并将它们分配到我的 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;
  }

当我尝试将这些用户信息分配给我的类属性时,问题就开始了。这是我的用户类。我收到如下错误。它是关于未来类型的,但我无法处理。我该怎么办?

“未来”类没有实例获取器“电子邮件”。 接收者:“未来”的实例 尝试呼叫:电子邮件

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

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

【问题讨论】:

    标签: firebase flutter dart future


    【解决方案1】:

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

    currentUser.userName = user.data['userName']; 因为 currentUser 为空。一个简单的解决方案是将
    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 作为方法的参数,或将其保留在方法中。

    【讨论】:

    • 用户 currentUser = User();解决了我的问题。但是当我尝试从另一个类访问 currentUser.email 时,我仍然遇到同样的错误。例如;我从主屏幕调用此方法,例如 onPressed: () { dynamic user = FirebaseActions.userDataStream(loggedInUser.email);打印(用户。电子邮件); }); },但我又得到了同样的错误 Class 'Future' has no instance getter 'email'。
    猜你喜欢
    • 2021-12-16
    • 2018-09-20
    • 2021-12-31
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2021-04-26
    相关资源
    最近更新 更多