144 votes

Comment changer la valeur à l'intérieur d'un champ de texte flutter ?

J'ai un TextEditingController où si un utilisateur clique sur un bouton, celui-ci se remplit d'informations. Je ne parviens pas à trouver comment modifier le texte à l'intérieur d'un bouton Textfield ou TextFormField . Existe-t-il une solution ?

247voto

Raouf Rahiche Points 4482

Il suffit de modifier le text propriété

    TextField(
      controller: txt,
    ),
    RaisedButton(onPressed: () {
        txt.text = "My Stringt";
    }),

tandis que txt est juste un TextEditingController

  var txt = TextEditingController();

30 votes

En utilisant ce code, le curseur va à gauche du champ. Y a-t-il un moyen de le corriger ?

3 votes

@rickdroio Vérifiez cette réponse il mettra le curseur à la fin.

0 votes

@rickdroio oui, le commentaire ci-dessous stackoverflow.com/a/58307018/7691350

73voto

rfarias Points 93

Le problème avec le simple fait de mettre

_controller.text = "New value";

est que le curseur sera repositionné au début (dans le champ de texte de l'article). Utilisation de

_controller.text = "Hello";
_controller.selection = TextSelection.fromPosition(
    TextPosition(offset: _controller.text.length),
);
setState(() {});

n'est pas efficace car elle reconstruit le widget plus que nécessaire (lors de la définition de la propriété text et lors de l'appel à setState).

--

Je pense que le meilleur moyen est de tout combiner en une seule commande simple :

final _newValue = "New value";
_controller.value = TextEditingValue(
      text: _newValue,
      selection: TextSelection.fromPosition(
        TextPosition(offset: _newValue.length),
      ),
    );

Il fonctionne correctement pour les champs de texte Material et Cupertino.

4 votes

Cette réponse devrait être la bonne, car elle résout le problème de la modification de la valeur du contrôleur et du retour constant du curseur au début du texte.

10 votes

Une autre suggestion, lorsque nous fournissons un décalage, nous pouvons faire : int currentOffset = _textEditingController.selection.base.offset ; Et ensuite fournir currentOffset comme décalage. Cela permettra également de gérer le cas où l'utilisateur se trouve entre les chaînes de caractères.

41voto

CopsOnRoad Points 4705

En utilisant cette solution, vous serez également en mesure de mettre le curseur à la fin de nouveau texte.

final TextEditingController _controller = TextEditingController();

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: Center(child: TextField(controller: _controller)),
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        _controller.text = "Hello";

        // this changes cursor position
        _controller.selection = TextSelection.fromPosition(TextPosition(offset: _controller.text.length));
        setState(() {});
      },
    ),
  );
}

0 votes

Comment puis-je implémenter ceci dans un champ de texte ?

0 votes

@emanuelsanga Juste remplacer TextField avec TextFormField dans le code donné.

0 votes

Mais j'ai besoin de la validation du formulaire lorsque le formulaire est enregistré.

28voto

Chaythanya nair Points 389

Vous pouvez utiliser le contrôleur d'édition de texte pour manipuler la valeur d'un champ de texte.

var textController = new TextEditingController();

Maintenant, créez un nouveau champ de texte et définissez textController comme contrôleur du champ de texte, comme indiqué ci-dessous.

 new TextField(controller: textController)

Maintenant, créez un RaisedButton n'importe où dans votre code et définissez le texte souhaité dans le champ onPressed de la méthode RaisedButton .

new RaisedButton(
       onPressed: () {
          setState(() {
             textController.text = "New text";
          });
       }
    ),

11 votes

Il n'est pas nécessaire d'appeler setState lors de la modification du texte d'un champ de texte.

1 votes

@NihadDelic J'ai mis à jour sa réponse.

13voto

Daniel Points 306
_mytexteditingcontroller.value = new TextEditingController.fromValue(new TextEditingValue(text: "My String")).value;

Cela semble fonctionner si quelqu'un a une meilleure méthode, n'hésitez pas à me le faire savoir.

3 votes

Et pourquoi pas simplement : _mytexteditingcontroller.text= "votre texte".

0 votes

Parfait si vous voulez créer un TextField avec une valeur déjà remplie :)

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