2

假设有一个空的TextFormField. 手动输入 2 个字符后,我想以编程方式插入一个新字符。因此,如果长度等于 2,则插入一个新的。这听起来很简单,但在我尝试实现这一目标时出现了奇怪的行为。例如:光标不断跳回起点,可能会导致这个调试日志:

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

或者,如果我尝试处理TextEditingController's value 或 selection 属性以将光标放在文本末尾,则会导致更多奇怪的行为。

如果文本长度等于 2 ,您能否通过使用 aTextField或 aTextFormFieldTextEditingControlleron来提供一个示例,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 的问题。

https://github.com/flutter/flutter/issues/62654

4

0 回答 0