无法使用 TextFormField 更新文本
Cannot update text with TextFormField
我想在用户输入 2 个天数和 2 个月数后添加启动画面。下面的代码以前可以工作,但我不知道从哪个 flutter 版本开始,它开始表现得很奇怪。
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;
})
])
我想在用户输入 2 个天数和 2 个月数后添加启动画面。下面的代码以前可以工作,但我不知道从哪个 flutter 版本开始,它开始表现得很奇怪。
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;
})
])