选择焦点时TextField中的所有文本

时间:2018-09-15 12:48:44

标签: flutter

TextField焦点上,我想选择所有文本,以便在用户开始键入时删除现有文本。

这将替代Android中的android:selectAllOnFocus="true"

如何实现?

5 个答案:

答案 0 :(得分:10)

显式传递一个控制器和focusNode,则您拥有完全控制权:

final _controller = TextEditingController(); 
final _focusNode = FocusNode();

initState() {
  super.initState();
  _focusNode.addListener(() {
    if(_focusNode.hasFocus) {
      _controller.selection = TextSelection(baseOffset: 0, extentOffset: _controller.text.length);
    }
  });
}

build() => TextField(controller: _controller, focusNode: _focusNode);

更新https://github.com/flutter/flutter/issues/28307#issuecomment-467952074开始,以防止无限循环:

_controller.addListener(() {
  final newText = _controller.text.toLowerCase();
  _controller.value = _controller.value.copyWith(
    text: newText,
    selection: TextSelection(baseOffset: newText.length, extentOffset: newText.length),
    composing: TextRange.empty,
  );
});

答案 1 :(得分:7)

还可以在onTap事件中设置选择。像这样:

TextField(
    controller: _controller,
    onTap: () => _controller.selection = TextSelection(baseOffset: 0, extentOffset: _controller.value.text.length),
)

答案 2 :(得分:3)

实际上比接受的答案容易得多。

首先初始化一个TextEditingController。

final _controller = TextEditingController();

然后,在构建方法的某个位置(可能在您的编辑文本逻辑中),像这样设置文本和选择道具。

_controller.text = textValue;
_controller.selection = TextSelection(
    baseOffset: 0,
    extentOffset: textValue.length,
);

在TextFormField中,确保分配控制器并将autofocus设置为true。

TextFormField(
    controller: _controller,
    autofocus: true,
    //...more properties

就是这样!

答案 3 :(得分:3)

要获得更清洁、可重复使用的体验,Extension class method(请参阅下面的注释)非常方便。

Sub CopySheet()
    Dim wbk1 As Workbook, wbk2 As Workbook

    'Workbooks("発注残マクロ").Activate

    Set wbk1 =  Workbooks("発注残マクロ")
    Set wbk2 = Workbooks("ocs680j")

    'シートの名前を記入
    wbk2.Worksheets("ocs680j").Copy After:=wbk1.Sheets(wbk1.Sheets.Count)
    wbk2.Saved = True
    wbk2.Close SaveChanges:=False
    
End Sub

在球场上:

extension TextEditingControllerExt on TextEditingController {
  void selectAll() {
    if (text == null || text.isEmpty) return;
    selection = TextSelection(baseOffset: 0, extentOffset: text.length);
  }
}

注意

TextField( controller: myController, onTap: () => myController.selectAll() ) 类中,可以省略 extension

this 假定为:textthis.text

<this instance of controller>.text 实际上是 selection 相同。

答案 4 :(得分:2)

从Dart 2开始:

 controller1.selection = TextSelection(baseOffset:0, extentOffset:controller1.text.length);