首页 > 解决方案 > 表单的字段未初始化

问题描述

有一个带有表格的状态类

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

但是表单的字段没有得到更新,即当熨平板呈现时,电子邮件字段为空。为什么?

标签: flutter

解决方案


这是因为_getEmail()似乎是一个async函数。您正在_getEmail()initState().

此时,UI 不会等待async进程完成(await),build()方法被调用,并且String _email仍然null(未初始化)。

解决方案是在异步完成后TextFormField使用电子邮件的值更新。TextEditingController_getEmail()

您的代码应如下所示:

  1. TextEditingController为电子邮件字段创建一个对象:
TextEditingController emailFieldController = TextEditingController();
  1. 将控制器附加到电子邮件字段:
TextFormField(
    controller: emailFieldController,
    validator: (value) {
        if (value.isEmpty) {
            return 'Please enter some text';
        }
        _email = value;
        return null;
    },
),
  1. 在您的_getEmail()函数中,将电子邮件值更新到控制器:
_getEmail().then((value) {
      emailFieldController.text = value;
   });

推荐阅读