首页 > 解决方案 > TextFormField 检索焦点并在键盘关闭时重新分配初始值

问题描述

我发现自己与 DropdownButton 一起使用 TextFormField。视图内部发生了一个奇怪的过程。我把步骤如下:

  1. 对于 TexFormField,我分配了一个初始值: controller: _nameController..text = datumAdministrative.name.

初始值

  1. 我在 TextFormField 中输入了一个新值。

新价值

  1. 部署 DropdownButton 时,键盘关闭,整个 Widget 被重绘,导致 TextFormField 恢复其初始值,并且不保留输入的新值。

键盘关闭

有什么办法可以避免选择 DropdownButton 时 TextFormField 返回其初始值?如果您能帮助我发帖或提供反馈,我将不胜感激。

代码脚手架:

return Scaffold(
  resizeToAvoidBottomPadding: false,
  resizeToAvoidBottomInset: true,
  appBar: AppBar(
      backgroundColor: ColorsTheme.primary,
      leading: GestureDetector(
        onTap: () {
          Navigator.pushReplacementNamed(context, 'administrativeListData');
        },
        child: Container(
            padding: EdgeInsets.all(16),
            child: FaIcon(FontAwesomeIcons.arrowLeft)),
      ),
      centerTitle: true,
      title: Text(datumAdministrative.name +
          ' ' +
          datumAdministrative.lastNameFather),
      automaticallyImplyLeading: false),
  body: Stack(
    children: <Widget>[
      ImageBackground(),
      _sizeBoxHeight(),
      Container(
        child: Form(
          key: formValidator.formKey,
          child: ListView(
            children: <Widget>[
              _containerImageUser(context, datumAdministrative),
              _sizeBoxHeight(),

             
              CustomCardExpansionTile(
                title: Constants.administrativeData,
                icon: FontAwesomeIcons.addressBook,
                widget: Container(
                    padding: EdgeInsets.all(15),
                    child: responsiveDataAdministrative(context)),
              ),

             
              CustomCardExpansionTile(
                  title: Constants.addressInformationAdministrative,
                  icon: FontAwesomeIcons.houseUser,
                  widget: Container(
                      padding: EdgeInsets.all(15),
                      child: responsiveAddressInformationAdministrative(
                          context))),

              
              CustomCardExpansionTile(
                  title: Constants.userDataSystem,
                  icon: FontAwesomeIcons.idCard,
                  widget: Container(
                      padding: EdgeInsets.all(15),
                      child: responsiveInformationSystemAdministrative(
                          context))),

            ],
          ),
        ),
      ),
    ],
  ),
);

代码TextFormField:

TextFormField(
  controller: _nameController..text = datumAdministrative.name,
  keyboardType: TextInputType.text,
  textInputAction: null,
  textCapitalization: TextCapitalization.sentences,
  onChanged: (value) => formValidator.name = value,
  validator: (value) {
    if (formValidator.fieldValidText(value)) {
      return null;
    } else {
      return Constants.nameAdministrativeMessage;
    }
  });

标签: flutter

解决方案


我看到您为方法内部的text属性设置了值。因此,每当小部件重建时都会调用它,从而使该字段的值恢复为初始值。TextEditingControllerbuild

文档实际上讲述了它:

文本属性

设置此项将通知此 TextEditingController 的所有侦听器他们需要更新(它调用 notifyListeners)。出于这个原因,这个值应该只在帧之间设置,例如响应用户操作,而不是在构建、布局或绘制阶段。

要修复它,您应该在此处删除级联符号:

controller: _nameController..text = datumAdministrative.name,

initState()改为在里面做:

@override
void initState() {
   _nameController.text = datumAdministrative.name;
}

推荐阅读