Поместить курсор в конец текстового поля при фокусировке?

#flutter #flutter-layout

#колебание #смещение-макет

Вопрос:

У меня есть TextField , в котором с самого начала указан текст по умолчанию. Я хочу, чтобы курсор был помещен в конец существующего текста, когда TextField получает фокус (возможно, с условием, что текст не должен был уже быть изменен по сравнению с текстом по умолчанию).

Я пытался установить controller.selection , но это не сработало. Я также пытался использовать FocusNode :

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

Это действительно работает, но одним из побочных эффектов является то, что несколько текстовых полей выглядят так, как будто они находятся в фокусе одновременно. Как я могу предотвратить это? Или, что еще лучше, есть ли лучший способ достичь того, чего я хочу?

Комментарии:

1. @pskink Ты имеешь в виду в FocusNode ? Это имеет тот же эффект, что и TextSelection.collapsed() т.е. работает, но искажает фокус других элементов управления, так что несколько текстовых полей могут быть сфокусированы одновременно…

2. @pskink Странно… Я пробую это на эмуляторе API 26, он показывает текстовые курсоры в текстовых полях даже после фокусировки другого текстового поля (но только последнее сфокусированное получает текст при вводе).

Ответ №1:

Если для TextField задано значение, по умолчанию курсор при фокусировке располагается в конце текста / значения. Дайте мне знать, если поведение, с которым вы столкнулись, отличалось.

Текстовые поля должны быть индивидуальными FocusNode . Поскольку вы используете один focusNode для нескольких, как только одно текстовое поле сфокусировано, кажется, что в фокусе находится несколько текстовых полей.

Что касается отслеживания, которое TextField содержит текст, также необходим индивидуальный TextEditingController . Что я могу предложить, так это создать список FocusNode и TextEditingController для текстовых полей.

 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],
),
...