onChange TextField移动光标以开始抖动

Sam*_*man 5 textfield flutter

我尝试用中的onChange方法检查输入,TextField但用TextEditingController光标替换文本后将其移动到的开始TextField

仅在Android平台上会出现此问题。

TextField(
controller: textEditController,
onChanged: (content) {
                    textEditController.text = checkNumber(content);
                  },)
Run Code Online (Sandbox Code Playgroud)

扑扑版

[?] 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)
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 15

使用 TextEditingController

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

  • Thx,GünterZöchbauer。我很高兴我们有一个更简单的解决方案,而不是在Flutter问题小组中尝试所有这些变通办法,网址为https://github.com/flutter/flutter/issues/11416 (3认同)
  • 我认为offset必须是“ offset:textEditController.text.length”。请更新答案 (2认同)
  • 然后你会在最后设置光标。问题是关于在开始时设置它,不是吗? (2认同)

小智 12

接受的解决方案对我不起作用 - 因为我正在设置textselection ,我需要改为设置value

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();
}
Run Code Online (Sandbox Code Playgroud)

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


vis*_*hwa 8

**如果你想随文本动态移动光标**

setState(() {

    String text = "sometext";

    _controller.value = TextEditingValue(
             text: text,
             selection: TextSelection(
                       baseOffset: text.length,
                       extentOffset: text.length)
    );
});
Run Code Online (Sandbox Code Playgroud)