Багаторядкове текстове поле у ​​флаттері


116

Це може звучати просто, але як ми можемо багаторядно редагувати текстове поле у ​​флаттері? TextField працює лише з одним рядком.

Редагувати: деякі точні, оскільки здається, що це не зрозуміло. Хоча ви можете встановити багаторядковий режим для віртуального обтікання текстового вмісту, він все одно не багаторядковий. Це один рядок, що відображається на кілька рядків. Якщо ви хочете зробити щось подібне, то не можете. Тому що у вас немає доступу до ENTERкнопки. І відсутність кнопки введення означає відсутність багаторядкової.

Відповіді:


201

Щоб використовувати автоматичне перенесення, просто встановіть maxLinesяк null:

TextField(
  keyboardType: TextInputType.multiline,
  maxLines: null,
)

Якщо maxLinesвластивість є null, кількість ліній не обмежена, і обтікання ввімкнено.


Улов у тому, щоб мати maxLines: null. Без
привітання

26

Якщо ви хочете, щоб ваш TextField адаптувався до вводу користувача, зробіть це:

TextField(
    keyboardType: TextInputType.multiline,
    minLines: 1,//Normal textInputField will be displayed
    maxLines: 5,// when user presses enter it will adapt to it
    );

тут встановіть максимум рядків, що завгодно, і ви готові піти. На мою думку, встановлення максимальних рядків на нуль - невдалий вибір, ми повинні встановити для нього якесь значення.


1
Я виправив ім'я віджета з: TextInputField на: TextField. У флаттері є не TextInputField, а лише TextField або TextFormField. Якщо ви не створили такий із власним іменем.
Кассіо Сеффрін,

13

Хоча інші люди вже згадували про те, що можна використовувати тип клавіатури "TextInputType.multiline", я хотів додати свою реалізацію TextField, яка автоматично адаптує свою висоту при введенні нового рядка, оскільки часто хочеться наслідувати поведінку введення WhatsApp та подібні програми.

Для цього я аналізую кількість символів "\ n" у вхідних даних при кожному зміні тексту. Це, здається, надмірне, але, на жаль, поки що я не знайшов кращої можливості досягти цього біхувуру у Flutter, і я не помітив жодних проблем із продуктивністю навіть на старих смартфонах.

class _MyScreenState extends State<MyScreen> {
  double _inputHeight = 50;
  final TextEditingController _textEditingController = TextEditingController();

  @override
  void initState() {
    super.initState();
    _textEditingController.addListener(_checkInputHeight);
  }

  @override
  void dispose() {
    _textEditingController.dispose();
    super.dispose();
  }

  void _checkInputHeight() async {
    int count = _textEditingController.text.split('\n').length;

    if (count == 0 && _inputHeight == 50.0) {
      return;
    }
    if (count <= 5) {  // use a maximum height of 6 rows 
    // height values can be adapted based on the font size
      var newHeight = count == 0 ? 50.0 : 28.0 + (count * 18.0);
      setState(() {
        _inputHeight = newHeight;
      });
    }
  }


  // ... build method here
  TextField(
    controller: _textEditingController,
    textInputAction: TextInputAction.newline,
    keyboardType: TextInputType.multiline,
    maxLines: null,
  )

1
Подумайте, як додати, як ви насправді використовуєте _inputHeight для встановлення висоти вводу
Алі Нассерзаде,

Оскільки TextField може обернути рядок, не розділяючи рядок із значенням \ \ n, не вдасться. Отже, я рахую текстові рядки за допомогою цього коду: int count = (_textEditingController.text.length / (MediaQuery.of (context) .size.width * 0,06)) .round ();
Реджиндо Ріго,

5

TextFieldмає властивість maxLines .

введіть тут опис зображення


1
Я це знаю. Поки він обгортає вміст, ви все одно не можете натиснути клавішу Enter, щоб створити новий рядок вручну. Принаймні на android, тому що у вас немає доступу до кнопки введення.
Rémi Rousselet

Ах, я пропустив це питання. Я бачив подібне питання, починаючи з 2016 року, тому припускав, що воно вирішено. Дуже сумно, ми все ще не можемо цього зробити.
Rémi Rousselet

2
Схоже, це тепер виправлено ( github.com/flutter/flutter/issues/8028 ). Я спробував багаторядковий рядок як на iOS, так і на Android, і тепер обидва можуть створювати нові рядки в текстовому полі.
Matt S.

Насправді він може створити новий рядок, але потрібно двічі натиснути клавішу Enter!
wendu


5

Використовуйте, expandsі вам не потрібно вводити minLinesабо maxLinesбудь-яке конкретне значення:

TextField(
  maxLines: null,
  expands: true, 
  keyboardType: TextInputType.multiline,
)


0

Офіційний документ стверджує : maxLinesвластивість можна встановити як нуль, щоб зняти обмеження кількості рядків. За замовчуванням це одне, тобто це однорядкове текстове поле.

ПРИМІТКА: maxLines не повинно бути нулем.


0

якщо вище раз не працював для вас , то спробуйте адд minLines також

TextField(
        keyboardType: TextInputType.multiline,
        minLines: 3,
        maxLines: null);

0

Для віджета TextFormField ви можете встановити minLines та maxLines, якщо хочете встановити фіксовану кількість рядків. В іншому випадку ви також можете встановити для maxLines значення null.

TextFormField(
      minLines: 5,
      maxLines: 7,
      decoration: InputDecoration(
          hintText: 'Address',
          border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
          ),
      ),
),
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.