Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase身份验证用户信息流_Firebase_Flutter_Firebase Authentication - Fatal编程技术网

Firebase身份验证用户信息流

Firebase身份验证用户信息流,firebase,flutter,firebase-authentication,Firebase,Flutter,Firebase Authentication,我有一个个人资料页面,显示用户当前注册的电子邮件,还有一个编辑图标,将用户带到可以编辑电子邮件的页面。 当用户成功更改电子邮件时,他将返回显示已注册电子邮件的上一页 我希望用户看到新的电子邮件。但是用户会一直看到旧的电子邮件,直到页面重新加载 所以我的第一个想法是用StreamBuilder自然地替换FutureBuilder。 我不确定如何获取当前用户的流,而不是未来用户的流,因此我使用了我所知道的FirebaseUser-->onAuthStateChanged的唯一流 Widget b

我有一个个人资料页面,显示用户当前注册的电子邮件,还有一个编辑图标,将用户带到可以编辑电子邮件的页面。 当用户成功更改电子邮件时,他将返回显示已注册电子邮件的上一页

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

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

  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)),
          );
        }
      },
    );
  }
这会让我检查我的更新电子邮件方法,并检查我的用户是否正在再次登录应用程序

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);
    }
  }
我做错什么了吗? 如何获取用户流? 获取当前用户的Firebase方法将返回未来

FirebaseAuth.instance.currentUser();

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

有流版本

FirebaseAuth.instance.userChanges(),
榜样

StreamBuilder<User>(
              stream: FirebaseAuth.instance.userChanges(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return Center(child: CircularProgressIndicator());
                }
                return Text(snapshot.data.displayName);
              },
            ),
StreamBuilder(
流:FirebaseAuth.instance.userChanges(),
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回中心(子项:CircularProgressIndicator());
}
返回文本(snapshot.data.displayName);
},
),
FirebaseAuth.instance.currentUser();
FirebaseAuth.instance.userChanges(),
StreamBuilder<User>(
              stream: FirebaseAuth.instance.userChanges(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return Center(child: CircularProgressIndicator());
                }
                return Text(snapshot.data.displayName);
              },
            ),