聚焦时将光标定位在TextField的末尾吗?

时间:2019-03-06 09:23:21

标签: flutter flutter-layout

我有一个TextField,它从一开始就带有默认文本。我希望在TextField获得焦点时将光标放置在现有文本的末尾(可能条件是该文本不应已经从默认文本中被修改)。

我尝试设置controller.selection无效。我也尝试使用FocusNode

focusNode: FocusNode()..addListener((){
    if( !record.isCommentModified )
        record.textEditingController.selection = TextSelection.collapsed(offset: record.comment.length);
})

它确实有效,但是副作用是多个文本字段看起来好像它们同时具有焦点。我该如何预防?甚至更好,是否有更好的方法来实现我想要的?

1 个答案:

答案 0 :(得分:0)

如果在 TextField 上设置了值,则默认情况下,光标在获得焦点时位于文本/值的末尾。如果您遇到的行为有所不同,请告诉我。

TextFields 需要有单独的 FocusNode。由于您将单个 FocusNode 用于多个,因此一旦聚焦一个 TexField,似乎有多个聚焦的 TextField。

至于跟踪哪个 TextField 包含文本,还需要单独的 TextEditingController。我可以建议的是为 TextFields 创建一个 FocusNodeTextEditingController 列表。

late List<FocusNode> focusNodeList;
late List<TextEditingController> textController;

@override
void initState() {
  super.initState();
  // Initialize both List
  textController = List<TextEditingController>.generate(
      length, (index) => TextEditingController());
  focusNodeList = List<FocusNode>.generate(length, (index) {
    var focusNode = FocusNode();
    focusNode.addListener(() {
      // Do something
    });
    return focusNode;
  });
}

并将它们设置在您的 TextField

TextField(
  controller: textController[0],
  focusNode: focusNodeList[0],
),
TextField(
  controller: textController[1],
  focusNode: focusNodeList[1],
),
...