首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebase身份验证用户信息流

Firebase身份验证用户信息流
EN

Stack Overflow用户
提问于 2020-08-14 13:53:19
回答 1查看 623关注 0票数 1

我有一个配置文件页面,显示用户他当前注册的电子邮件和一个编辑图标,带他到页面,在那里他可以编辑电子邮件。当用户成功更改电子邮件时,他将返回到向其显示已注册电子邮件的上一页。

我想让用户看到新的电子邮件。但用户会一直看到旧的电子邮件,直到页面重新加载。

因此,我的第一个想法是自然地用StreamBuilder取代FutureBuilder。我不确定如何获得当前用户的流,而不是未来的用户流,所以我使用了我所知道的唯一用于FirebaseUser的流--> onAuthStateChanged

代码语言:javascript
复制
  Widget buildEmail() {
    return StreamBuilder(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting)
          return Center(
              child: SpinKitRing(
            color: Colors.white,
            size: 30,
          ));
        else if (snapshot.hasError)
          return Center(child: Text(snapshot.error));
        else {
          // final email = snapshot.data.data['email'];
          final email = snapshot.data.email;
          return Padding(
            padding: const EdgeInsets.only(left: 25.0),
            child: Text('$email', style: TextStyle(color: Colors.black)),
          );
        }
      },
    );
  }

这个StreamBuilder的行为与我之前使用的FutureBuilder相同

代码语言:javascript
复制
  Widget buildEmail() {
    return FutureBuilder(
      future: FirebaseAuth.instance.currentUser(),
      builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting)
          return Center(
              child: SpinKitRing(
            color: Colors.white,
            size: 30,
          ));
        else if (snapshot.hasError)
          return Center(child: Text(snapshot.error));
        else {
          // final email = snapshot.data.data['email'];
          final email = snapshot.data.email;
          return Padding(
            padding: const EdgeInsets.only(left: 25.0),
            child: Text('$email', style: TextStyle(color: Colors.black)),
          );
        }
      },
    );
  }
}

所以我查看了onAuthStateChanged的文档,它写道:

代码语言:javascript
复制
  /// Receive [FirebaseUser] each time the user signIn or signOut

这导致我检查我的更新电子邮件方法,并检查我的用户是否再次登录到应用程序。

代码语言:javascript
复制
static Future<void> updateEmail(String password, String newEmail, BuildContext context) async {
    final user = await CurrentUser.getCurrentUser();
    final ref = Firestore.instance.collection('users');

    try {
      AuthCredential credential = EmailAuthProvider.getCredential(email: user.email, password: password);
      AuthResult result = await user.reauthenticateWithCredential(credential);  // Sign in?
      result.user.updateEmail(newEmail);
      ref.document(user.uid).updateData({'email': newEmail});
      Navigator.of(context).pop();
      Fluttertoast.showToast(msg: 'Success!');
    } on PlatformException catch (error) {
      print(error);
      changeEmailErrorDialog(context, error: error.message);
    } catch (error) {
      print(error);
      changeEmailErrorDialog(context, error: error);
    }
  }

我认为我是在登录用户,因为这种方法可以防止ERROR_REQUIRES_RECENT_LOGIN异常

代码语言:javascript
复制
  AuthResult result = await user.reauthenticateWithCredential(credential);  // Sign in?

我做错了什么吗?如何获取用户流?用于获取当前用户的Firebase方法返回一个将来

代码语言:javascript
复制
FirebaseAuth.instance.currentUser();

这个方法不是应该有一个流版本吗?

EN

回答 1

Stack Overflow用户

发布于 2020-10-17 19:38:13

它有一个流版本;

代码语言:javascript
复制
FirebaseAuth.instance.userChanges(),

示例;

代码语言:javascript
复制
StreamBuilder<User>(
              stream: FirebaseAuth.instance.userChanges(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return Center(child: CircularProgressIndicator());
                }
                return Text(snapshot.data.displayName);
              },
            ),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63407287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档