假设有一个空的TextFormField
。手动输入2个字符后,我想以编程方式插入一个新字符。所以,如果长度等于2,就插入一个新的。这听起来很简单,但当我试图实现这一点时,出现了奇怪的行为。例如:光标连续跳回到起始位置,可能会导致以下调试日志:
文本选择索引被钳制(-1->0(以保持在边界内。这可能不是你的错,因为有些键盘可能会选择越界。
或者,如果我试图处理TextEditingController
的值或选择属性,将光标放在文本的末尾,它会导致更多奇怪的行为。
你能给我举一个例子吗?用TextField
或TextFormField
加TextEditingController
,如果文本长度等于2,在onChanged()
上,在末尾插入一个新字符,并将光标放回末尾。
我尝试了这些解决方案,但在这种情况下它们不起作用:
如何更改文本字段flutter内部的值?
谢谢!
EDIT:示例代码:
void main() => runApp(MyApp());
/// This Widget is the main application widget.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'example',
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
final TextEditingController controller = TextEditingController(text: '');
@override
Widget build(BuildContext context) {
return TextFormField(
controller: controller,
onChanged: (value) {
if (controller.text != null && controller.text.length == 2) {
controller.text = '$value/';
controller.selection = TextSelection.fromPosition(
TextPosition(offset: controller.text.length));
setState(() {});
}
},
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
问题是:如果我将TextFormField替换为TextField,它将按预期工作我想这是一个应该修复的错误
我还发现了一个链接,在flutter版本1.20.1及更高版本中,这是TextFormFields的问题。
https://github.com/flutter/flutter/issues/62654
TextFormField是一个包含TextField的FormField。虽然Form不需要是其父级,但使用Form可以更容易地同时管理多个字段。如果TextField工作得更好并且满足要求,那么您可以坚持使用它。