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