【问题标题】:How to use .currentUser method in flutter如何在颤振中使用 .currentUser 方法
【发布时间】:2020-12-17 07:17:54
【问题描述】:

我有一些代码:

  getFavSalons(AsyncSnapshot<QuerySnapshot> snapshot) {
return snapshot.data.documents
    .map((doc) => SalonBlock(
          salonName: doc["salonName"],
          location: doc["location"],
          workTime: doc["workTime"],
          rating: doc["rating"],
        ))
    .toList();

}

以及我构建列表的部分代码:

             StreamBuilder(
                  stream: Firestore.instance
                      .collection("customers")
                      .document("HAQaVqCPRfM7h6yf2liZlLlzuLu2")
                      .collection("favSalons")
                      .snapshots(),
                  builder:
                      (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                    if (snapshot.hasData) {
                      return Container(
                        margin:
                            EdgeInsets.only(bottom: screenHeight * 0.33),
                        child: new ListView(
                          children: getFavSalons(snapshot),
                        ),
                      );
                    }
                    return LoadingSalon();
                  }),

这里我使用 uid:

.document("HAQaVqCPRfM7h6yf2liZlLlzuLu2")

这里我必须使用 currentUser 而不是填写自己。如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

    确保您已将 firebase_auth 导入您的班级

    像这样创建 FirebaseAuth 和 User 的实例:

    final auth = FirebaseAuth.instance;
    User currentUser;
    
    /// Function to get the currently logged in user
      void getCurrentUser() {
          currentUser = auth.currentUser;
          if(currentUser) {
             // User is signed in
          } else {
             // User is not signed in
          }
      }
    

    您可以在有状态类的 initState 中调用 getCurrentUser 函数来获取当前加载的 Widget,如下所示:

    @override
      void initState() {
        getCurrentUser();
    
        super.initState();
      }
    

    您现在可以将之前的代码更改为:

    StreamBuilder(
        stream: Firestore.instance
          .collection("customers")
          .document(currentUser.uid)
          .collection("favSalons")
          .snapshots(),
        builder:
          (context, AsyncSnapshot<QuerySnapshot> snapshot) {
            if (snapshot.hasData && snapshot.connectionState == ConnectionState.active) {
              return Container(
                margin:
                    EdgeInsets.only(bottom: screenHeight * 0.33),
                child: new ListView(
                  children: getFavSalons(snapshot),
                ),
              );
            }
        return LoadingSalon();
    }),
    

    这应该对你有用了:)

    【讨论】:

    • 这似乎是过时的信息,对此行为进行了重大更改。它还引入了会在您的应用中产生错误的竞争条件,因此更改包可能是件好事。
    • 不幸的是,出现错误“在 null 上调用了 getter 'uid'。”
    • 真的吗? @nvoigt 我不知道。我得调查一下。
    【解决方案2】:

    您应用程序中的当前用户可以随时更改。例如:

    • 当用户启动应用程序时,Firebase 会自动恢复他们之前的身份验证状态。但这需要它调用服务器,因此用户在登录之前暂时没有登录(currentUsernull)。
    • 当用户登录时,Firebase 每小时刷新一次他们的身份验证状态,以确保他们的登录仍然有效(例如他们的帐户没有被禁用)。这意味着即使您没有明确调用 API,他们的登录状态也会发生变化。

    由于这些原因,您不能简单地调用currentUser 并期望它保持有效。相反,您应该使用attach an auth state change listener,它会为您提供身份验证状态流。

    在构建 UI 的代码中,您可以在另一个流构建器中使用此用户数据流。所以你会有两个嵌套的流构建器:

    1. 用于用户身份验证状态。
    2. 对于数据库,基于当前用户。

    类似(暂时未测试):

     StreamBuilder(
         stream: FirebaseAuth.instance.authStateChanges(),
         builder: (context, AsyncSnapshot<User> snapshot) {
            if (snapshot.hasData) {
              return StreamBuilder(
                  stream: Firestore.instance
                      .collection("customers")
                      .document(snapshot.data.uid)
                      .collection("favSalons")
                      .snapshots(),
                  builder:
                      (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                    if (snapshot.hasData) {
                      return Container(
                        margin:
                            EdgeInsets.only(bottom: screenHeight * 0.33),
                        child: new ListView(
                          children: getFavSalons(snapshot),
                        ),
                      );
                    }
                    return LoadingSalon();
                  }),
            }
            return Text("Loading user...");
          }),
             
    

    【讨论】:

    • 它在“stream: Firebase.instance.authStateChanges()”这一行向我显示错误:“未定义名称'Firebase'。尝试将名称更正为已定义或定义的名称名字。”
    • 另外,当我将 Firebase 更改为 FirebaseAuth 时,authStateChanges() 显示错误,因为它未在此方法中定义
    • #1) 是的,这是文档中的复制/粘贴错误。我更新了它。我强烈建议您自己解决此类问题,因为从我还提供的链接中找出正确的语法应该不难。 2)如果仍然存在,请检查您正在使用的库版本。
    【解决方案3】:

    FirebaseUser 目前已被弃用,您可以如下所示获取 CurrentUser;

    FirebaseAuth.instance.currentUser;
    

    如果您想了解更多关于可以使用哪些参数的信息,请查看他们的文档;

    https://firebase.flutter.dev/docs/auth/usage

    【讨论】:

    • 您的示例的这种用法是否正确“.document(FirebaseAuth.instance.currentUser.toString())”因为我试图打印它并显示我拥有它时没有授权用户跨度>
    猜你喜欢
    • 2021-10-18
    • 2022-01-04
    • 2020-01-10
    • 2019-12-13
    • 2021-08-09
    • 2019-01-23
    • 2021-03-29
    • 2020-08-25
    • 2020-05-03
    相关资源
    最近更新 更多