我尝试使用firebase auth和firestore管理用户角色,但当我尝试将snapshot.data
传递给我创建的类以在firestore中保存用户日期时,我收到了此错误。我遵循了教程,但我的代码不同,我正在使用更新的版本。
class Start extends StatelessWidget {
const Start({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasData && snapshot.data!=null) {
UserHelper.saveUser(snapshot.data);
return const Home();
} else if (snapshot.hasError) {
return const Center(child: Text('Algo ha salido mal!'));
} else {
return const LoginScreen();
}
}),
);
}
}
我创建的类:
class UserHelper {
static FirebaseFirestore db = FirebaseFirestore.instance;
static saveUser(User user) async {
Map<String, dynamic> userData = {
"name": user.displayName,
"email": user.email,
"last_login": user.metadata.lastSignInTime,
"created_at": user.metadata.creationTime,
"role": "user",
};
final userRef = db.collection('users').doc(user.uid);
if ((await userRef.get()).exists) {
await userRef.update({
"last_login": user.metadata.lastSignInTime,
});
} else {
await userRef.set(userData);
}
}
}
2条答案
按热度按时间6psbrbz91#
您的方法:
接受一个
User
,但是你传递给它的是snapshot.data
:这绝对不是
User
。您可能需要在
User
类上使用fromJson
方法,将JSON转换为User
。然后你会称之为:
8fq7wneg2#
您将获得可为空的用户类型
Stream<User?> authStateChanges()
的流您应该使用
!
运算符放弃为空性:UserHelper.saveUser(snapshot.data!)
,这样做是安全的,因为您在if子句中有snapshot.data!=null
检查顺便说一句,您可能需要重新考虑您的业务逻辑。用户配置文件(名称、电子邮件)发生更改时不会触发
authStateChanges()
,但您需要在下游调用中更新这些内容。发生这些更改时会触发userChanges()
,但如果您订阅了该流,则无需始终更新last_login
。请参见https://firebase.flutter.dev/docs/auth/start/#userchanges