我试图通过Streamer从Firebase读取用户数据,并将它们分配到我的User类的属性中。我有一个FirabaseActions类在做Firebase的事情。下面是我使用Streamer获取数据的方法。它工作得很完美,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;
}
当我试图将这些用户信息分配到我的类属性时,问题就开始了。这是我的用户类。我得到了一个像下面这样的错误。这是关于未来类型,但我不能处理它。我应该怎么做?
类'Future'没有实例getter 'email'.Receiver: 'Future'的实例,尝试调用:email。
class User {
String userName;
String userID;
String email;
int level;
User({this.userName, this.userID, this.level, this.email});
}
第一个问题是,你不能像这样分配一个用户名。
currentUser.userName = user.data['userName'];
因为currentUser是null。一个简单的解决方案是将 User currentUser;
与 User currentUser = User();
第二个问题。
我认为你不应该通过他的电子邮件来搜索用户,而应该通过你从
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作为一个方法的参数,或者把它留在方法中。