【问题标题】:onChange TextField move cursor to start in flutteronChange TextField 移动光标以开始颤动
【发布时间】:2019-07-15 07:56:40
【问题描述】:

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

这个问题只出现在Android平台上。

代码

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

颤振版本

[✓] 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)

【问题讨论】:

    标签: flutter textfield


    【解决方案1】:

    使用TextEditingController设置选择

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

    【讨论】:

    • 我认为偏移量必须是offset: textEditController.text.length。请更新答案
    • 然后将光标设置在末尾。问题在于一开始就设置它,不是吗?
    • 我的问题是在更改文本后自动移动光标开始。我可能无法提出一个好的问题。无论如何,我的问题解决了。谢谢你:)
    • 谢谢,Günter Zöchbauer。我很高兴我们有一个更简单的解决方案,而不是在 Flutter 问题组 github.com/flutter/flutter/issues/11416 中尝试所有这些解决方法
    • 什么是checkNumber函数?
    【解决方案2】:

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

    TextEditingController class 文档指出:

    可以从添加到此控制器的侦听器中设置文本或选择属性。如果两个属性都需要更改,则应设置控制器的值。

    该文档还有一个相关示例,其中包括以下内容:

    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();
    }
    

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

    【讨论】:

    • 这也适用于我使用 TextSelection.fromPosition 。谢谢
    【解决方案3】:

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

    setState(() {
    
        String text = "sometext";
    
        _controller.value = TextEditingValue(
                 text: text,
                 selection: TextSelection(
                           baseOffset: text.length,
                           extentOffset: text.length)
        );
    });
    

    【讨论】:

    • 简单高效的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2021-05-18
    • 2020-07-23
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多