假设有一个空的TextFormField
. 手动输入 2 个字符后,我想以编程方式插入一个新字符。因此,如果长度等于 2,则插入一个新的。这听起来很简单,但在我尝试实现这一目标时出现了奇怪的行为。例如:光标不断跳回起点,可能会导致这个调试日志:
文本选择索引被限制(-1->0)以保持在边界内。这可能不是您的错,因为某些键盘可能会选择超出范围。
或者,如果我尝试处理TextEditingController
's value 或 selection 属性以将光标放在文本末尾,则会导致更多奇怪的行为。
如果文本长度等于 2 ,您能否通过使用 aTextField
或 aTextFormField
和TextEditingController
on来提供一个示例,onChanged()
而不是在末尾插入一个新字符并将光标也放回末尾。
我尝试了这些解决方案,但在这种情况下它们不起作用:
如何更改文本字段颤动中的值?
谢谢!
编辑:示例代码:
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,它会按预期工作。我想这是一个应该修复的错误。
我还在颤振版本 1.20.1 中找到了一个链接,后来这是 TextFormFields 的问题。