有一个状态类的形式
class MyCustomFormState extends State<MyCustomForm> {
final _formKey = GlobalKey<FormState>();
String _email, _password;
并且存在其中一种形式initialValue
使用
TextFormField(
initialValue: _email,
validator: (value) {
if (value.isEmpty) {
return 'Please enter some text';
}
_email = value;
return null;
},
),
要初始化我使用的电子邮件值
void initState() {
super.initState();
_getEmail().then((value) {
setState(() {
_email = value;
print('_email was $_email');
});
});
...
在日志中,我获取了真实的电子邮件值
_email是[email protected]
但是表单的字段不会更新,即,在显示熨平板时,电子邮件字段为空。为什么?
这是因为_getEmail()
似乎是一个async
功能。您正在_getEmail()
从中调用函数initState()
。
此时,UI不会等待async
过程完成(await
),build()
方法会被调用,并且String _email
仍然null
(未初始化)。
解决方案是在异步完成后TextFormField
使用电子邮件的值更新。TextEditingController
_getEmail()
您的代码应如下所示:
TextEditingController
为电子邮件字段创建一个对象:TextEditingController emailFieldController = TextEditingController();
TextFormField(
controller: emailFieldController,
validator: (value) {
if (value.isEmpty) {
return 'Please enter some text';
}
_email = value;
return null;
},
),
_getEmail()
函数中,更新发送给控制器的电子邮件值:_getEmail().then((value) {
emailFieldController.text = value;
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句