Flutter:如何在TextField / TextFormField中正确插入文本

问题描述

让我们说一个空的TextFormField。手动输入2个字符后,我想以编程方式插入一个新的字符。因此,如果长度等于2,则插入一个新的长度。听起来确实很简单,但是在我尝试实现此目标时出现了奇怪的行为。例如:光标连续跳回起点,并可能导致以下调试日志:

将文本选择索引限制为(-1-> 0)以保持界限。这可能不是您的错,因为某些键盘可能会选择超出范围。

或者,如果我尝试处理TextEditingController的value或selection属性以将光标置于文本的末尾,则会引起更多奇怪的行为。

您能提供一个示例吗?如果文本长度等于2,则使用TextFieldTextFormFieldTextEditingController并在onChanged()上插入一个新字符最后将光标放回末尾。

我尝试了这些解决方案,但在这种情况下它们不起作用:
How do you change the value inside of a textfield flutter?

谢谢!

编辑:示例代码

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)