6
votes

Comment empêcher le clavier de se fermer en appuyant sur la touche Soumettre en flottement?

Je crée une application flottante dans laquelle l'utilisateur peut taper un message et appuyer sur le bouton d'envoi DANS LE CLAVIER pour envoyer le message. Le problème est que lorsque j'appuie sur le bouton d'envoi, le message est envoyé mais le clavier est automatiquement rejeté. Comment puis-je empêcher que cela se produise? Merci d'avance.

TextField(
  autofocus: true,
  keyboardType: TextInputType.multiline,
  maxLines: null,
  decoration: new InputDecoration.collapsed(
    hintText: "Let's talk",
    border: UnderlineInputBorder(
      borderRadius: BorderRadius.circular(1),
    ),
  ),
  textInputAction: TextInputAction.send,
  onSubmitted: null,
)


2 commentaires

Pourriez-vous partager le code pertinent avec nous?


@RobinReiter a changé la touche entrée du clavier en touche envoyer textInputAction: TextInputAction.send


4 Réponses :


1
votes
SystemChannels.textInput.invokeMethod('TextInput.show');
on onSubmit method

4 commentaires

le onSubmit appelle une méthode qui envoie le message dans le champ de texte


^ pas clair. cette réponse fonctionnera essayez avec dans un setState ou dans une méthode onSubmit faire une nouvelle requête


@BenjithKizhisseri n'existe pas de moyen d'empêcher le champ de texte de perdre le focus


mais alors je devrai appeler le focus sur le champ de texte chaque fois que j'appuie sur le bouton d'envoi



12
votes

Cela a fonctionné pour moi: -

Commencez par créer un FocusNode et attribuez-le à votre champ de texte, procédez comme suit: -

Le FocusNode code > est un composant de longue durée alors initialisez-le dans la méthode initState : -

TextField(
            focusNode: inputFieldNode,
            onSubmitted: (String) => FocusScope.of(context).requestFocus(inputFieldNode),
          )

N'oubliez pas de nettoyer le FocusNode code > dans la méthode dispose après la suppression du formulaire: -

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

Assignez le FocusNode au champ de texte et écrivez ce qui suit code dans onSubmitted::-

FocusNode inputFieldNode;

 @override
  void initState() {
    super.initState();
    inputFieldNode = FocusNode();
  }

Maintenant, le champ de texte ne perdra pas le focus même après avoir appuyé sur le bouton d'envoi.


0 commentaires

1
votes

L'approche la plus propre serait d'utiliser onEditingComplete () avec TextEditingController au lieu de onSubmitted (text). Reportez-vous à l'exemple ci-dessous.

  final _controller = TextEditingController();
  TextField(
       controller: _controller,
       padding: EdgeInsets.all(8),
       textInputAction: TextInputAction.send,
       placeholder: 'Type your message',
       onEditingComplete: (){
           if (_controller.text.isEmpty) return;

           sendMessage(_controller.text);
       },
  ),


0 commentaires

1
votes

Le widget TextField a un paramètre juste à cet effet!

Alors que le rappel onSubmit peut être utilisé pour gérer la logique métier lorsque l'utilisateur Une fois terminé, il existe également une propriété appelée onEditingComplete , spécialement conçue pour gérer la logique liée au focus. Vous devriez donc utiliser les deux, pour une meilleure lisibilité du code.

Selon le docs :

L'implémentation par défaut de onEditingComplete exécute 2 différents comportements basés sur la situation:

Lorsqu'une action de fin est activée, telle que «terminé», «aller», «envoyer» ou "recherche", le contenu de l'utilisateur est soumis au responsable du traitement, puis la concentration est abandonnée.

Lorsqu'une action de non-achèvement est activée, comme "suivant" ou "précédent", le contenu de l'utilisateur est soumis au contrôleur, mais le focus n'est pas abandonné car les développeurs voudront peut-être immédiatement se concentrer sur un autre widget d'entrée dans onSubmitted.

Par conséquent, si vous n'aimez pas ce comportement, par exemple, "envoyer" est considéré comme une "action de fin" ici, donc dans une application de messagerie instantanée (chat), chaque fois que l'utilisateur envoie un court message , le clavier sera réduit. Mais si nous remplaçons le rappel onEditingComplete vers une fonction vide, cela arrêtera le comportement par défaut et ne masquera pas le clavier.

Exemple de code: p>

TextField(
  controller: _controller,
  onSubmitted: (value) {
    sendMessage(text);
    _controller.clear();
  },
  onEditingComplete: () {}, // do nothing
  textInputAction: TextInputAction.send,
)

Démo:

demo gif

Pour une explication complète et comparaison entre les rappels onSubmitted et onEditingComplete , consultez mon autre réponse ici a >.


0 commentaires