Campo di testo multilinea in movimento


118

Può sembrare facile, ma come possiamo creare un campo di testo modificabile su più righe in flutter? TextField funziona solo con una singola riga.

Modifica: alcune precisioni perché sembra che non sia chiaro. Sebbene sia possibile impostare la multilinea per avvolgere virtualmente il contenuto del testo, non è ancora multilinea. È una singola riga visualizzata in più righe. Se vuoi fare qualcosa del genere, non puoi. Perché non hai accesso a ENTERbutton. E nessun pulsante Invio significa nessuna multilinea.

Risposte:


204

Per utilizzare la funzione di avvolgimento automatico, imposta maxLinescome null:

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

Se la maxLinesproprietà è null, non c'è limite al numero di righe e il ritorno a capo è abilitato.


Il problema è avere maxLines: null. Senza ciao non sembra funzionare
Sisir

26

Se vuoi che il tuo TextField si adatti all'input dell'utente, fallo:

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

qui imposta le linee massime su quello che vuoi e sei a posto. A mio parere, impostare le maxlines su null non è una buona scelta, dovremmo impostarlo su un valore.


1
Ho corretto il nome del widget da: TextInputField, a: TextField. In flutter non c'è TextInputField, solo TextField o TextFormField. A meno che non ne crei uno con nome personalizzato.
Cassio Seffrin

14

Sebbene altre persone abbiano già menzionato che è possibile utilizzare il tipo di tastiera "TextInputType.multiline", ho voluto aggiungere la mia implementazione di un TextField che adatta automaticamente la sua altezza quando viene inserita una nuova riga, poiché spesso si desidera imitare il comportamento di input di WhatsApp e app simili.

Sto analizzando il numero di caratteri "\ n" nell'input per questo scopo ogni volta che il testo viene modificato. Questo sembra essere eccessivo, ma sfortunatamente non ho trovato una possibilità migliore per raggiungere questo beahivour in Flutter finora e non ho notato problemi di prestazioni anche su smartphone più vecchi.

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
Considera l'idea di aggiungere come usi effettivamente _inputHeight per impostare l'altezza dell'input
Ali Nasserzadeh,

Dato che TextField può mandare a capo la riga senza dividere la riga con il conteggio "\ n", il conteggio fallirà. Quindi sto contando le righe di testo con questo codice: int count = (_textEditingController.text.length / (MediaQuery.of (context) .size.width * 0.06)) .round ();
Reginaldo Rigo

6

Usa questo

TextFormField(
      keyboardType: TextInputType.multiline,
      maxLines: //Number_of_lines(int),)

5

TextFieldha la proprietà maxLines .

inserisci qui la descrizione dell'immagine


1
Lo so. Mentre avvolge il contenuto, non puoi ancora premere Invio per creare manualmente una nuova riga. Almeno su Android, perché non hai accesso al pulsante Invio.
Rémi Rousselet

Ah, mi sono perso quel problema. Ho visto un problema simile risalente al 2016, quindi ho pensato che fosse risolto. Abbastanza triste non possiamo ancora farlo.
Rémi Rousselet

2
Sembra che ora sia stato risolto ( github.com/flutter/flutter/issues/8028 ). Ho provato il multi-linea sia su iOS che su Android ed entrambi ora possono creare nuove linee nel campo di testo.
Matt S.

Può effettivamente creare una nuova riga ora, ma deve premere il tasto Invio due volte!
wendu

5

Usa expandse non hai bisogno di dare minLineso maxLinesalcun valore specifico:

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


0

Il documento ufficiale dichiara : la maxLinesproprietà può essere impostata su null per rimuovere la restrizione sul numero di righe. Per impostazione predefinita , è uno, il che significa che questo è un campo di testo a riga singola.

NOTA: maxLines non deve essere zero.


0

se sopra una volta non ha funzionato per te, prova ad aggiungere anche minLines

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

0

Per il widget TextFormField , è possibile impostare minLines e maxLines se si desidera impostare un numero fisso di righe. Altrimenti puoi anche impostare maxLines su null.

TextFormField(
      minLines: 5,
      maxLines: 7,
      decoration: InputDecoration(
          hintText: 'Address',
          border: OutlineInputBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
          ),
      ),
),
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.