Flutter 在FuturBuilder的颤振项目中使用StreamBuilder是否正确?
我使用Firebase身份验证和云FireStore插件。我想使用最佳实践,很难找到一个好的例子来说明我的努力。internet上的每个示例都显示仅使用Auth或仅使用Firestore 但是,如果想要拥有当前登录用户的配置文件页面,该怎么办?我首先需要检索当前用户ID,那么我是否使用FutureBuilder?现在我想从那个用户那里得到结果,那么接下来我是否要使用StreamBuilder呢?很难理解关于颤振的最佳实践 有人说,要在statefullwidget中执行此操作,请将快照的引用置于initstate中 其他人正在使用Statefull小部件 下面是一个我试图实现的代码示例,但我确实认为这是一种愚蠢的方式。 PS:Flutter 在FuturBuilder的颤振项目中使用StreamBuilder是否正确?,flutter,google-cloud-firestore,firebase-authentication,Flutter,Google Cloud Firestore,Firebase Authentication,我使用Firebase身份验证和云FireStore插件。我想使用最佳实践,很难找到一个好的例子来说明我的努力。internet上的每个示例都显示仅使用Auth或仅使用Firestore 但是,如果想要拥有当前登录用户的配置文件页面,该怎么办?我首先需要检索当前用户ID,那么我是否使用FutureBuilder?现在我想从那个用户那里得到结果,那么接下来我是否要使用StreamBuilder呢?很难理解关于颤振的最佳实践 有人说,要在statefullwidget中执行此操作,请将快照的引用置于
AuthHelper().uid()
以字符串形式返回uid。我为此创建了一个函数,我不知道如何使用FireAuth在1行中完成它
class EducatorScreen extends StatelessWidget {
static const routeName = '/educatorScreen';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: geAppBar(context, 'Contrôle Éducateur'),
body: FutureBuilder(
future: AuthHelper().uid(),
builder: (BuildContext context, AsyncSnapshot<String> uidSnapshot) {
if (uidSnapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
}
return StreamBuilder(
stream: Firestore.instance
.collection('users')
.document(uidSnapshot.toString())
.snapshots(),
builder: (ctx, educatorSnapshot) {
if (educatorSnapshot.data['favoriteNursery'] != 'none') {
return nurseryWidget(
context, educatorSnapshot.data['favoriteNursery']);
} else {
return noNurseryWidget(context);
}
});
}),
);
}
}
class EducatorScreen扩展了无状态小部件{
静态常量routeName='/educatorScreen';
@凌驾
小部件构建(构建上下文){
返回脚手架(
附录:geAppBar(上下文为“教育控制”),
正文:未来建设者(
future:AuthHelper().uid(),
生成器:(构建上下文上下文,异步快照uidSnapshot){
if(uidSnapshot.connectionState==connectionState.waiting){
返回循环ProgressIndicator();
}
返回流生成器(
流:Firestore.instance
.collection('用户')
.document(uidSnapshot.toString())
.snapshots(),
建筑商:(ctx、教育者快照){
如果(educatorSnapshot.data['FavoriteTurry']!='none'){
返回育儿区(
上下文,educatorSnapshot.data['FavoriteTurry'];
}否则{
返回非urserywidget(上下文);
}
});
}),
);
}
}
类AuthHelper{
Future uid()异步{
//返回用户ID
final FirebaseUser user=等待FirebaseAuth.instance.currentUser();
返回user.uid;
}
}
像这样嵌套构建器确实很正常
您的FutureBuilder
将一直解析,直到用户通过身份验证。在此之前,您可以选择显示类似“验证用户…”的内容
然后,您的StreamBuilder
将解析,直到加载数据。在这种情况下,您可能会显示“正在加载用户数据…”之类的内容
也可以在这里看到我的问题和答案,关于从两个流加载数据,其中一个解决方案是嵌套构建器:谢谢Frank,谢谢。我认为使用FireAuth获取用户ID的方式并不理想,你有什么建议?每个人都创建一个异步函数来返回字符串吗?确保用户经过身份验证本质上是一个异步操作,因为它可能需要调用服务器,并且可以随时更改(因为令牌每小时刷新一次)。所以我觉得你做的很好。在最新的FlatterFire库中,这将是一种不同的语法,因为它们切换到状态更改侦听器:
class AuthHelper {
Future<String> uid() async {
// Return UserID
final FirebaseUser user = await FirebaseAuth.instance.currentUser();
return user.uid;
}
}