【问题标题】:Is this correct to use a StreamBuilder in FuturBuilder for Flutter project?在 Flutter 项目的 FuturBuilder 中使用 StreamBuilder 是否正确?
【发布时间】:2020-12-16 15:29:34
【问题描述】:

我使用 Firebase 身份验证和 Cloud FireStore 插件。我想使用最佳实践,但很难找到一个很好的例子来说明我尝试做的事情。互联网上的每个示例都显示仅使用 Auth 或仅使用 Firestore。

但是,如果想要拥有当前登录用户的个人资料页面怎么办?我首先需要检索当前的用户 ID,所以我使用 FutureBuilder 吗?现在我想从那个用户那里得到结果,所以我之后要使用 StreamBuilder 吗?关于颤振的最佳实践真的很难理解。

有人说在statefullwidget中做,在initstate中放一个快照的引用 其他人正在使用 Statefull Widget。

这是我尝试实现的代码示例,但我确实认为这是愚蠢的方式。 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 AuthHelper {
  Future<String> uid() async {
    // Return UserID
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    return user.uid;
  }
}

【问题讨论】:

    标签: flutter google-cloud-firestore firebase-authentication


    【解决方案1】:

    这样嵌套构建器确实很正常。

    您的FutureBuilder 将解析,直到用户通过身份验证。您可以选择在此之前显示“正在验证用户...”之类的内容。

    然后您的StreamBuilder 将解析,直到加载数据。在此过程中,您可能会显示“正在加载用户数据...”之类的内容。

    还可以在这里查看我的问题和答案,关于从两个流中加载数据,其中一种解决方案也是嵌套构建器:How do I join data from two Firestore collections in Flutter?

    【讨论】:

    • 感谢弗兰克,感谢。我认为我获取用户 ID 的方式不是 FireAuth 的最佳选择,你有什么建议?每个人都创建一个异步函数来返回一个字符串吗?
    • 确保用户通过身份验证本质上是一个异步操作,因为它可能需要调用服务器,并且可以随时更改(因为令牌每小时刷新一次)。所以你所做的对我来说看起来不错。这将是最新的 FlutterFire 库中的不同语法,因为它们切换到状态更改侦听器:firebase.flutter.dev/docs/auth/usage#authentication-state
    猜你喜欢
    • 2021-04-09
    • 2020-12-16
    • 2021-10-12
    • 2011-07-24
    • 2022-12-25
    • 1970-01-01
    • 2020-03-30
    • 2019-11-29
    • 2021-12-20
    相关资源
    最近更新 更多