我有一个配置文件页面,显示用户他当前注册的电子邮件和一个编辑图标,带他到页面,在那里他可以编辑电子邮件。当用户成功更改电子邮件时,他将返回到向其显示已注册电子邮件的上一页。
我想让用户看到新的电子邮件。但用户会一直看到旧的电子邮件,直到页面重新加载。
因此,我的第一个想法是自然地用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)),
);
}
},
);
}这个StreamBuilder的行为与我之前使用的FutureBuilder相同
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的文档,它写道:
/// Receive [FirebaseUser] each time the user signIn or signOut这导致我检查我的更新电子邮件方法,并检查我的用户是否再次登录到应用程序。
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异常
AuthResult result = await user.reauthenticateWithCredential(credential); // Sign in?我做错了什么吗?如何获取用户流?用于获取当前用户的Firebase方法返回一个将来
FirebaseAuth.instance.currentUser();这个方法不是应该有一个流版本吗?
发布于 2020-10-17 19:38:13
它有一个流版本;
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);
},
),https://stackoverflow.com/questions/63407287
复制相似问题