flutter - 无法使用 TextFormField 更新文本
问题描述
我想在用户输入 2 个日数和 2 个月数后添加启动画面。下面的代码以前工作过,但我不知道从哪个颤振版本开始,它开始表现得很奇怪。
class MyCustomForm extends StatefulWidget {
@override
_MyCustomFormState createState() => _MyCustomFormState();
}
class _MyCustomFormState extends State<MyCustomForm> {
final _dobInputController = TextEditingController();
String _lastDobValue = '';
@override
void initState() {
super.initState();
_dobInputController.addListener(_onTextChange);
}
@override
void dispose() {
_dobInputController.dispose();
super.dispose();
}
_onTextChange() {
int length = _dobInputController.text.length;
if (_lastDobValue.length < length && (length == 2 || length == 5)) {
_dobInputController.text += '/';
_dobInputController.selection = TextSelection.fromPosition(TextPosition(offset: length + 1));
}
_lastDobValue = _dobInputController.text;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
TextFormField(
controller: _dobInputController,
decoration: InputDecoration(
hintText: 'MM/DD/YYYY',
),
)
],
),
));
}
}
只需替换TextFormField
为TextField
,它将再次正常工作。
解决方案
我们应该使用它inputFormatters
来避免内部循环,因为使用更新文本TextEditingController
会调用自身并且行为异常:
TextFormField(
decoration: InputDecoration(
hintText: 'MM/DD/YYYY',
),
inputFormatters: [
TextInputFormatter.withFunction((oldValue, newValue) {
String newText = newValue.text;
int newTextLength = newText.length;
if (newValue.text.length > oldValue.text.length && (newTextLength == 2 || newTextLength == 5)) {
return TextEditingValue(
text: newText + '/',
selection: TextSelection.fromPosition(TextPosition(offset: newTextLength + 1)));
}
return newValue;
})
])
推荐阅读
- sharepoint - OneNote API - 获取存储在组织 SharePoint 网站中的笔记本
- python - 返回类的新实例的方法
- typescript - ReferenceError:未定义“用户名”
- swift - 仅将 sizeForItemAt 应用于一个 collectionView
- kubernetes - Kubernetes:基于路径仅适用于 root
- jquery - 使用jquery验证远程消息错误实现输入标签错误
- c# - 为什么我对 TextBox 验证规则参数的绑定不起作用?
- c# - 如何从对象发送到组合框 1 属性
- dto - 是否可以设计一个只返回部分 API 响应的 DTO?
- configuration - Maximo Linear:通过单击地图定义工作订单开始/结束措施?