300 votes

Champ de texte multiligne dans flutter

Cela peut sembler facile mais comment faire un champ de texte éditable de plusieurs lignes dans Flutter ? TextField ne fonctionne qu'avec une seule ligne.

Edit : quelques précisions car il semble que ce ne soit pas clair. Bien que vous puissiez définir le multiline pour envelopper virtuellement le contenu du texte, ce n'est toujours pas un multiline. Il s'agit d'une ligne unique affichée en plusieurs lignes. Si vous voulez faire quelque chose comme ça, vous ne pouvez pas. Parce que vous n'avez pas accès à ENTER bouton. Et pas de bouton d'entrée signifie pas de ligne multiple.

535voto

Fellipe Sanches Points 555

Pour utiliser l'enveloppement automatique, il suffit de définir maxLines comme null :

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

Si le maxLines la propriété est null il n'y a pas de limite au nombre de lignes et l'habillage est activé.

2 votes

Le piège est d'avoir maxLines: null . Sans lui, il ne semble pas fonctionner

14 votes

Si vous voulez que ça ait l'air plus épais comme <textarea> en HTML, utilisez minLines: 4

1 votes

Que faire si je veux donner des informations pour la ligne 5 maximum ?

120voto

taranjeet singh Points 726

Si vous voulez que votre champ de texte s'adapte à la saisie de l'utilisateur, faites ceci :

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

Ici, réglez les lignes maximales sur ce que vous voulez et vous êtes prêt à partir. A mon avis, définir les lignes max à null n'est pas un bon choix, nous devrions le définir à une certaine valeur.

1 votes

J'ai corrigé le nom du widget de : TextInputField, à : TextField. Dans Flutter, il n'y a pas de TextInputField, seulement TextField ou TextFormField. A moins que vous n'en créiez un avec un nom personnalisé.

0 votes

Dans votre exemple, il affiche par défaut 5 lignes. Je veux voir 1 seule ligne. Si vous voulez ajouter plus de données, vous pouvez appuyer sur la touche Entrée.

0 votes

Ne fonctionne pas pour moi

59voto

Rémi Rousselet Points 45139

Depuis septembre 2017, une valeur d'enum a été ajoutée pour prendre en charge l'édition de texte multiligne.

new TextField(
  keyboardType: TextInputType.multiline,
  maxLines: whatever,
)

41voto

CopsOnRoad Points 4705

Utilisez expands et tu n'as pas besoin de donner minLines ou maxLines une valeur spécifique :

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

27voto

Jeff S. Points 145

Bien que d'autres personnes aient déjà mentionné que le type de clavier "TextInputType.multiline" peut être utilisé, je voulais ajouter mon implémentation d'un TextField qui adapte automatiquement sa hauteur lorsqu'une nouvelle ligne est saisie, car on souhaite souvent imiter le comportement de saisie de WhatsApp et d'applications similaires.

J'analyse le nombre de \n Dans ce but, il est nécessaire d'insérer dans l'entrée des caractères de type '' à chaque fois que le texte est modifié. Cela semble exagéré, mais malheureusement, je n'ai pas trouvé de meilleure possibilité de réaliser ce béhavior dans Flutter jusqu'à présent et je n'ai pas remarqué de problèmes de performance, même sur les anciens smartphones.

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 votes

Pensez à ajouter comment vous utilisez réellement _inputHeight pour définir la hauteur de l'entrée

1 votes

Comme TextField peut envelopper la ligne sans la diviser avec ' \n Le comptage échouerait. Je compte donc les lignes de texte avec ce code : int count = (_textEditingController.text.length / (MediaQuery.of(context).size.width * 0.06) ).round() ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X