如何在文本字段中颤动的值末尾设置光标位置?

Par*_*eri 74 flutter

问题是我想在文本字段的值末尾添加“,00”在 iOS 设备中效果很好,但在 android 中光标移动到文本字段中值的起点。所以,我无法添加“,00”。

jwe*_*rle 158

我在设置 a 时遇到了同样的问题,TextEditingController这对我有用。

controller.text = someString;
controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
Run Code Online (Sandbox Code Playgroud)

TextSelection.fromPosition() 执行以下操作(来自文档):

在给定的文本位置创建折叠选择。折叠的选区以相同的偏移量开始和结束,这意味着它包含零个字符,而是用作文本中的插入点。

  • 你救了我 !!非常感谢。实际上,我只需要使用 `Material Textfield` 来执行此操作,`CupertinoTextfield` 的行为符合预期。当将操作文本分配给其 `TextEditingController` 时,光标始终位于末尾。因为我认为这应该是文本字段的默认行为,所以我向 Flutter 团队提交了一个问题,因为如果你有这样的不同行为,这会破坏 Flutter 的目的.. 它并不是真正的多平台.. 我确信这是由于不同的团队造成的..但是,嘿,他们应该在事情​​上达成一致..无论如何..再次感谢您的优雅解决方法。 (2认同)
  • 当键盘有字典、自动更正和/或建议时,此功能不起作用 (2认同)

Pra*_*ani 20

如果您在控制器中设置值,则可以使用..运算符,如下所示:

final _controller = TextEditingController()..text = txtValue
      ..selection = TextSelection.collapsed(offset: txtValue.length);

)
Run Code Online (Sandbox Code Playgroud)

我认为当您设置值运行时时它非常有用。


Adi*_*til 13

更新文本字段中的文本后,简单易用的解决方案将光标移动到位置末尾,只需添加下面的行即可。

textController.selection =
      TextSelection.collapsed(offset: textController.text.length);
Run Code Online (Sandbox Code Playgroud)


Vic*_*khe 12

我用这个解决了我的问题

这会将您的光标设置在文本字段的末尾。

您可以随时随地调用代码,它会在调用时设置光标位置。

或简单地将此代码放在onChanged()文本字段的方法中

final val = TextSelection.collapsed(offset: _textTEC.text.length); 
 _textTEC.selection = val;
Run Code Online (Sandbox Code Playgroud)


Wil*_*iam 11

这对我有用:

_inputCtrl.value = TextEditingValue(
  text: suggestion,
  selection: TextSelection.collapsed(offset: suggestion.length),
);
Run Code Online (Sandbox Code Playgroud)

https://github.com/flutter/flutter/issues/11416#issuecomment-507040665


小智 10

这对我来说就像一个魅力。

myController.text = newText;
myController.selection = TextSelection(
    baseOffset: newText.length,
    extentOffset: newText.length)
Run Code Online (Sandbox Code Playgroud)


Joh*_*nal 7

似乎有效的解决方案如下:

  1. 为文本字段的构造函数提供一个 TextEditingController 参数:

    var myTextEditingController = TextEditingController();
    var myTextField = TextField(..., controller: myTextEditingController);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在文本字段中设置新文本时,请使用 TextEditingController,如下所示:

    myTextEditingController.value.copyWith(
      text: newText,
      selection: TextSelection(
        baseOffset: newText.length,
        extentOffset: newText.length
      )
    )
    
    Run Code Online (Sandbox Code Playgroud)

对于它所实现的效果来说,这似乎非常复杂,但它似乎是解决 Flutter 文本字段中光标未更新问题的唯一解决方案。


ray*_*rks 6

setter检查了ofTextEditingController的注释text,它说 [text] 和 [selection] 不应同时更改,但是对于电话输入,我们希望对输入应用某种格式(例如 ' 131 1111 1111') 同时将光标始终保持在末尾。

所以我只是使用定制的TextEditingController,它有效!

class PhoneEditingController extends TextEditingController {

  @override
  set text(String newText) {
    value = value.copyWith(
    text: newText,
    selection: TextSelection.collapsed(offset: newText.length),
    composing: TextRange.empty,
  );

}
Run Code Online (Sandbox Code Playgroud)


AND*_*NVT 5

如果您的新值太长。您应该将视图滚动到新的光标位置。

  1. 添加TextEditingControllerScrollControllerTextField

记得初始化/处理它们initStatedispose

TextField(
controller: controller,
scrollController: scrollController,
)
Run Code Online (Sandbox Code Playgroud)
  1. 设置新值和光标位置TextEditingController
controller.text = newValue;
controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
Run Code Online (Sandbox Code Playgroud)
  1. 将视图滚动到该位置
Future.delayed(Duration(milliseconds: 50),(){
 scrollController.jumpTo(scrollCtrl.position.maxScrollExtent);
});

Run Code Online (Sandbox Code Playgroud)