flutter - TextFormField 检索焦点并在键盘关闭时重新分配初始值
问题描述
我发现自己与 DropdownButton 一起使用 TextFormField。视图内部发生了一个奇怪的过程。我把步骤如下:
- 对于 TexFormField,我分配了一个初始值:
controller: _nameController..text = datumAdministrative.name
.
- 我在 TextFormField 中输入了一个新值。
- 部署 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;
}
});
解决方案
我看到您为方法内部的text
属性设置了值。因此,每当小部件重建时都会调用它,从而使该字段的值恢复为初始值。TextEditingController
build
文档实际上讲述了它:
文本属性
设置此项将通知此 TextEditingController 的所有侦听器他们需要更新(它调用 notifyListeners)。出于这个原因,这个值应该只在帧之间设置,例如响应用户操作,而不是在构建、布局或绘制阶段。
要修复它,您应该在此处删除级联符号:
controller: _nameController..text = datumAdministrative.name,
initState()
改为在里面做:
@override
void initState() {
_nameController.text = datumAdministrative.name;
}
推荐阅读
- flutter - 在颤振应用程序中找到资产文件的路径
- vue.js - vue.config.js devServer 未考虑在内
- objective-c - 约束单窗口MacOS Objective-C的纵横比
- javascript - React Native Render 错误缺少分号
- javascript - 将脚本注入 CefSharp
- python - 如何从 JSON 请求中解析特定数据
- rust - 如何在非异步函数上等待 Rust Future
- powershell - 如何通过 FullName 属性加快对 Win32_UserAccount 过滤的查询
- python - 关于线程模块和树莓派的问题
- javascript - 在 CSS 或 Javascript 本身中设置 Javascript Textelement 样式