Flutter通过查询firestore创建自定义用户模型;type'未来<动态>'不是类型&



我像Users>一样将用户名保存在firestore中;用户名>username:用户名,mail:mail我正在使用电子邮件,通过身份验证。

我想创建一个自定义的用户模型来保留当前用户的用户名和邮件。我可以使用currentUser.email在findCurrentUser((函数中成功地访问username,但当我试图用findCurrentUser函数返回的内容创建一个模型时,我遇到了错误。

以下是完整错误:

════════提供程序捕获到异常══════════════════════════════════════════════════════════════这个引发了以下断言:引发了异常_MapStream<用户,自定义用户>收听

StreamProvider,但未提供catchError

异常:类型"Future"不是类型"String"的子类型

这是我的功能和型号:

class CustomUser {
final String email;
final String username;
CustomUser({this.email, this.username,});
Map<String, dynamic> toJson() => {
'email': email,
'username': username
};
}

dynamic findCurrentUser() async {
var email = _firebaseAuth.currentUser.email;
var user =  await FirebaseFirestore.instance
.collection("Users")
.where('email', isEqualTo: email).get().then((value) => value.docs.first.data()['username']);
print('user); 
return user; 
}
CustomUser customUser(User user) {
return user != null
? CustomUser(email: user.email, username:  findCurrentUser())
: null;
}
Stream<CustomUser> get user {
return _firebaseAuth.authStateChanges().map(customUser);
} 

我的供应商:

StreamProvider(
create: (context) =>
context.read<AuthenticationService>().user,
),

在使用future之前,您总是需要解析它,即使您对future调用了wait并在方法中解析了它,异步方法也会再次返回future。

在这种特殊情况下,您调用的是findCurrentUser,它为字符串字段返回一个Future,因此会出现错误。

  • 这里有一些修复

由于您的模型中只有用户和电子邮件,我建议使用onAuthStateChange返回的User

如果你仍然想继续使用这个模型,你真的不需要进行额外的查询,如果你只需要电子邮件和用户名,你可以直接从firebaseauth获得。

现在最简单的方法是在一个函数中映射用户,然后调用以修复错误。


Future<CustomUser> findCurrentUser(User user) async {
var email = _firebaseAuth.currentUser.email;
var user =  await FirebaseFirestore.instance
.collection("Users")
.where('email', isEqualTo: email)
.get().then((value) => value.docs.first.data()['username']);

return CustomUser(email: user.email, username: user); 
}

Stream<CustomUser> get user {
return _firebaseAuth.authStateChanges().map(findCurrentUser);
} 

相关内容