问题描述
我的应用程序已实现Firebase身份验证,每个用户都必须输入其 显示名称 才能注册到应用程序中。
逻辑很简单,用户单击“ 更改显示名称”按钮,将出现一个 ModalBottomSheet ,用户可以在其中输入其新显示名称并保存。但是通过这种方式,更改显示名称后屏幕不会得到更新,直到我重新加载或重新启动应用程序为止。
class Body extends StatelessWidget {
final FirebaseAuth _auth = FirebaseAuth.instance;
@override
Widget build(BuildContext context) {
String displayName = _auth.currentUser.displayName;
final _formKey = GlobalKey<FormState>();
String newdisplayName;
return Scaffold(
appBar: AppBar(),body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: [
Text(
'Current display name is:',style: TextStyle(fontSize: 20),),Text(
'$displayName',style: TextStyle(fontSize: 25),RaisedButton(
child: Text('Change display Name'),onpressed: () {
showModalBottomSheet(
isScrollControlled: true,context: context,builder: (context) {
return Padding(
padding: MediaQuery.of(context).viewInsets
child: Form(
key: _formKey,child: Column(
mainAxisSize: MainAxisSize.min,children: [
TextFormField(
decoration: Inputdecoration(
labelText: 'New display Name',keyboardType: TextInputType.text,onSaved: (value) {
newdisplayName = value;
},RaisedButton(
child: Text('Change'),onpressed: () {
_formKey.currentState.save();
_auth.currentUser
.updateProfile(displayName: newdisplayName);
Navigator.pop(context);
},],);
},);
},);
}
}
我尝试在不同的地方调用.reload,但是显示名称在刷新页面之前不会更改。
_auth.currentUser.reload();
编辑:感谢https://stackoverflow.com/users/11921453/twelve
用以下StreamBuilder包装manin小部件,您将能够立即检索snapshot.data.displayName。
child: StreamBuilder<User>(
stream: FirebaseAuth.instance.userChanges(),
解决方法
Firebase具有可监听用户更改的流。在您的_auth旁边定义此流。
用au streambuilder包装小部件树并将其值设置为已定义的流。
现在,每次用户数据更改时,都会重新构建小部件树。