通过你的Flatter应用程序访问已登录Firebase用户的最干净方式是什么?
我在我的Flatter应用程序中使用firebase,访问登录用户将执行以下操作-通过你的Flatter应用程序访问已登录Firebase用户的最干净方式是什么?,firebase,flutter,Firebase,Flutter,我在我的Flatter应用程序中使用firebase,访问登录用户将执行以下操作- Future<FirebaseUser> getLoggedInUser() async { return await FirebaseAuth.instance.currentUser(); } 但这会导致一些问题,比如在StreamBuilder中访问它会成为一个问题,因为需要使用wait,这意味着我需要使StreamBuilder异步(不确定如何) 从应用程序中的任何位置访问用
Future<FirebaseUser> getLoggedInUser() async {
return await FirebaseAuth.instance.currentUser();
}
但这会导致一些问题,比如在StreamBuilder中访问它会成为一个问题,因为需要使用wait,这意味着我需要使StreamBuilder异步(不确定如何)
从应用程序中的任何位置访问用户对象FirebaseUser
的最佳/最干净的方式是什么
谢谢
编辑1:
这样做的一种方法是每次我需要当前用户时都使用一个有状态的小部件
class _MyWidgetState extends State<MyWidget> {
FirebaseUser user;
@override
void initState() {
super.initState();
_updateCurrentUser();
}
void _updateCurrentUser() async {
FirebaseUser currUser = await Firebase.instance.currentUser();
setState(() {
user = currUser;
});
}
class\u MyWidgetState扩展状态{
FirebaseUser用户;
@凌驾
void initState(){
super.initState();
_updateCurrentUser();
}
void\u updateCurrentUser()异步{
FirebaseUser currUser=等待Firebase.instance.currentUser();
设置状态(){
用户=当前用户;
});
}
但是每次我需要currUser时都使用有状态的小部件似乎很奇怪。有更好的方法吗?您可以使用流访问用户,例如
StreamBuilder(
stream:FirebaseAuth.instance.onAuthStateChanged,
builder:(context,snapshot){
if (snapshot.connectionState == ConnectionState.active) {
final user = snapshot.data;
return Text("User Id:${user.uid}");
}else{
return Center(
child:CircularProgressIndicator(),
);
}
}
);
您是否使用状态管理解决方案来存储
Firebase用户
。该对象上保存的信息很少,而且不太可能经常更改,为什么您需要一直从Firebase
获取它?嗯,我只想依靠Firebase进行所有身份验证。我可以缓存它,但不确定这是否有用我的想法是因为Firebase维护所有oauth过期。但是即使我缓存它,返回的内容仍然是未来的对象。在Streambuilder中使用它仍然存在问题,对吗?关于如何解决这个问题有什么建议吗?嗯,在处理其他Firebase查询时,您需要访问currUser。因此在这种情况下我必须嵌套流或使用类似StreamZip的东西。似乎太多了,不是吗?您可以通过提供程序返回提供程序来传递用户。value(value:user,child:OtherWidget());
StreamBuilder(
stream:FirebaseAuth.instance.onAuthStateChanged,
builder:(context,snapshot){
if (snapshot.connectionState == ConnectionState.active) {
final user = snapshot.data;
return Text("User Id:${user.uid}");
}else{
return Center(
child:CircularProgressIndicator(),
);
}
}
);