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

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

文本选择索引被夹紧(-1-> 0),以保持边界内。这可能不是您的问题,因为某些键盘可能会选择超出边界。

或者,如果我尝试处理TextEditingController的值或选择属性以将光标放置在文本末尾,则会导致更多奇怪的行为。
您能否通过使用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

你提供的链接正常工作。请发布您的复制代码。谢谢。 - chunhunghan
非常奇怪,因为如果我在IDE中使用断点调试进程,它可以正常运行,但在其他情况下就无法工作。 - Ricky
1个回答

0

TextFormField 是一个包含 TextField 的 FormField。虽然 Form 不一定是它的父级,但使用 Form 可以更轻松地管理多个字段。如果 TextField 更适合并且符合要求,您可以继续使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接