假设有一个空的。输入两个字符后,我想以编程方式插入一个新字符。因此,如果长度等于2,则插入一个新字符。听起来非常简单,但在尝试实现时会出现奇怪的行为。例如:光标不断跳回开头,并可能导致此调试日志:
您能否通过使用TextField或TextFormField与TextEditingController,并在onChanged()上,如果文本长度等于2,则在末尾插入一个新字符并将光标也放回到末尾提供示例。
我尝试了这些解决方案,但在这种情况下它们不起作用:
如何在Flutter中更改文本字段内的值? 谢谢!
EDIT:示例代码:
问题:如果我将TextFormField替换为TextField,则它的工作正常。我猜这是一个应该被修复的错误。
我还发现了一个链接,它表明在Flutter版本1.20.1及以后,这是关于TextFormFields的一个问题。 https://github.com/flutter/flutter/issues/62654
或者,如果我尝试处理TextEditingController的值或选择属性以将光标放置在文本末尾,则会导致更多奇怪的行为。文本选择索引被夹紧(-1-> 0),以保持边界内。这可能不是您的问题,因为某些键盘可能会选择超出边界。
您能否通过使用TextField或TextFormField与TextEditingController,并在onChanged()上,如果文本长度等于2,则在末尾插入一个新字符并将光标也放回到末尾提供示例。
我尝试了这些解决方案,但在这种情况下它们不起作用:
如何在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