flutter - 表单的字段未初始化
问题描述
有一个带有表格的状态类
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@email.org
但是表单的字段没有得到更新,即当熨平板呈现时,电子邮件字段为空。为什么?
解决方案
这是因为_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;
});
推荐阅读
- java - WebService 响应引发 SAXParser 异常
- sql - SQL Concat Rows if duplicate ID
- jquery - jquery - 鼠标悬停/鼠标离开 - 覆盖层闪烁
- reactjs - 反应选择多行标签
- sql-server - 列别名而不是技术名称
- python-2.7 - 获取父标签Selenium Python的元素
- reactjs - React Router v3 - IndexRoute 在 Google 缓存中不起作用
- gremlin - Gremlin 顺序模式和使用循环的边缘更新
- javascript - 页面切换脚本问题
- angular - Angular Material 6 datepicker 的关闭按钮可防止视图更新