无法返回从颤振中的 firestore 数据创建的用户对象的自定义'User'实例



我有一个自定义的"User"类,我正试图根据它的uid从firestore中检索用户的数据。我成功地将它映射到我的自定义"用户"对象中,但我无法从该函数返回。以下是代码片段:

class Wrapper extends StatelessWidget {
// set activeUser globally
User getCurrentUserObject(String uid) {
User _user;
var doc = DatabaseService().userCollection.document(uid);
doc.get().then((doc) {
_user = User().getUserFromData(doc.data);
print(" user: $_user");
});
return _user;
}
@override
Widget build(BuildContext context) {
ScreenUtil.init(context);
final currentUser = Provider.of<FirebaseUser>(context);
if (currentUser == null) {
print("No user logged in");
return Auth();
} else {
print("USER: ${getCurrentUserObject(currentUser.uid).email}");
print("Current user: ${currentUser.uid}");
return CustomerHomeScreen();
}
}
}

以下是错误片段:

════════ Exception caught by widgets library ═══════════════════════════════════
The getter 'email' was called on null.
Receiver: null
Tried calling: email
The relevant error-causing widget was
Wrapper 
lib/main.dart:20
════════════════════════════════════════════════════════════════════════════════
I/flutter (30822):  user: Instance of 'User'
I/flutter (30822):  user: Instance of 'User'

到目前为止,我认为它无法返回User实例。我怎样才能做到这一点?谢谢:(

UPDATE:添加包含getUserFromData()方法的User类。


class User {
final String uid;
final String name;
final String email;
final String phone;
final int gender;
final int type;
User({this.uid, this.name, this.email, this.phone, this.gender, this.type});
User getUserFromData(Map<String, dynamic> data) {
return User(
uid: data['uid'] ?? '',
name: data['name'] ?? '',
email: data['email'] ?? '',
phone: data['phone'] ?? '',
gender: data['gender'] ?? -1,
type: data['type'] ?? -1);
}
Map<String, dynamic> toJson() {
return {
'uid': uid,
'name': name,
'email': email,
'phone': phone,
'gender': gender,
'type': type
};
}
}

由于getCurrentUserObject方法在doc.get()完成之前返回_user变量,因此会出现错误。您可以通过将代码从使用.then更改为使用await来解决此问题,这样您就可以等待doc.get()的结果,然后再执行到下一行。

所以,这个:

User getCurrentUserObject(String uid) {
//Rest of the code
doc.get().then((doc) {
_user = User().getUserFromData(doc.data);
print(" user: $_user");
});
return _user;
}

变为:

Future<User> getCurrentUserObject(String uid) async {
//Rest of the code
var doc =  await doc.get();
_user = User().getUserFromData(doc.data);
print(" user: $_user");
return _user;
}

最新更新