在Flutter中,当TextField发生onChange事件时,如何将光标移动到开头?

22

我尝试使用 TextField 中的 onChange 方法检查输入,但在使用 TextEditingController 替换文本后,光标会移动到 TextField 的开头。

这个问题只发生在 Android 平台上。

代码:

TextField(
controller: textEditController,
onChanged: (content) {
                    textEditController.text = checkNumber(content);
                  },)

Flutter版本

[✓] Flutter (Channel master, v1.2.2-pre.41, on Mac OS X 10.14.3 18D109, locale
    en-IR)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
4个回答

30

使用TextEditingController设置选择

TextField(
controller: textEditController,
onChanged: (content) {
  textEditController..text = checkNumber(content)
                    ..selection = TextSelection.collapsed(offset: 0);
  },
)

8
我认为offset必须是 offset: textEditController.text.length。请更新回答。 - Saman
2
然后您将光标设置在末尾。问题是关于将其设置在开头,不是吗? - Günter Zöchbauer
1
我的问题是在更改文本后自动将光标移动到开头。我可能没有提出一个好的问题。不管怎样,我的问题已经解决了。谢谢 :) - Saman
3
谢谢,Günter Zöchbauer。我很高兴我们有一个更简单的解决方案,而不是尝试在Flutter问题组中使用所有这些变通方法https://github.com/flutter/flutter/issues/11416 - Kirill Karmazin
什么是checkNumber函数? - shinriyo
那只是一些自定义验证函数。 - Günter Zöchbauer

14
接受的解决方案对我没用 - 因为我设置了文本选择,所以我需要设置TextEditingController类文档指出:可以从添加到此控制器的侦听器内设置文本或选择属性。如果需要更改两个属性,则应设置控制器的值。文档还包含一个相关示例,其中包括以下内容:
void initState() {
  _controller.addListener(() {
    final text = _controller.text.toLowerCase();
    _controller.value = _controller.value.copyWith(
      text: text,
      selection: TextSelection(baseOffset: text.length, extentOffset: text.length),
      composing: TextRange.empty,
    );
  });
  super.initState();
}

这将强制输入的文本为小写,并将光标保持在输入末尾。


1
这个对我也起作用了,使用TextSelection.fromPosition。谢谢 - Anthony D.

8

如果您想要通过文本来动态移动光标

setState(() {

    String text = "sometext";

    _controller.value = TextEditingValue(
             text: text,
             selection: TextSelection(
                       baseOffset: text.length,
                       extentOffset: text.length)
    );
});

简单而高效的解决方案! - Roney Sampaio

0
这对我有用(我将textEditController存储在一个变量中):
TextField(
  controller: textEditController,
  onChanged: (content) {
     int cursorPos = textEditController.selection.base.offset;               
     textEditController.text = checkNumber(content);
     textEditController.selection = TextSelection.fromPosition(TextPosition(offset: cursorPos));
    },)

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