Flutter 在FuturBuilder的颤振项目中使用StreamBuilder是否正确?

Flutter 在FuturBuilder的颤振项目中使用StreamBuilder是否正确?,flutter,google-cloud-firestore,firebase-authentication,Flutter,Google Cloud Firestore,Firebase Authentication,我使用Firebase身份验证和云FireStore插件。我想使用最佳实践,很难找到一个好的例子来说明我的努力。internet上的每个示例都显示仅使用Auth或仅使用Firestore 但是,如果想要拥有当前登录用户的配置文件页面,该怎么办?我首先需要检索当前用户ID,那么我是否使用FutureBuilder?现在我想从那个用户那里得到结果,那么接下来我是否要使用StreamBuilder呢?很难理解关于颤振的最佳实践 有人说,要在statefullwidget中执行此操作,请将快照的引用置于

我使用Firebase身份验证和云FireStore插件。我想使用最佳实践,很难找到一个好的例子来说明我的努力。internet上的每个示例都显示仅使用Auth或仅使用Firestore

但是,如果想要拥有当前登录用户的配置文件页面,该怎么办?我首先需要检索当前用户ID,那么我是否使用FutureBuilder?现在我想从那个用户那里得到结果,那么接下来我是否要使用StreamBuilder呢?很难理解关于颤振的最佳实践

有人说,要在statefullwidget中执行此操作,请将快照的引用置于initstate中 其他人正在使用Statefull小部件

下面是一个我试图实现的代码示例,但我确实认为这是一种愚蠢的方式。 PS:
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;
  }
}