web-dev-qa-db-fra.com

Comment déplacer le focus vers le champ de texte suivant en flutter?

Je suis nouveau à Flutter.

Je crée un formulaire avec plusieurs entrées de texte en utilisant les widgets suivants: Form, TextFormField. Le clavier qui apparaît n'affiche pas l'action de champ "suivant" (qui devrait déplacer le focus sur le champ suivant) à la place, il s'agit de l'action "terminé" (qui masque le clavier).

J'ai cherché des indices dans les documents officiels, je n'ai rien trouvé directement qui puisse être fait. J'ai bien atterri sur FocusNode ( livre de cuisine , doc api ). Il fournit un mécanisme pour déplacer le focus par un bouton ou toute autre action sur l'application, mais je veux que ce soit dans le clavier .

9
Harsh Bhikadia

J'ai trouvé un moyen d'y parvenir.

  1. Affichage de l'icône suivante au lieu de Terminé - définition du paramètre textInputAction sur TextInputAction.next

  2. Utilisation du rappel onFieldSubmitted pour demander le nœud de focus du champ suivant.

    class FormWidget extends StatelessWidget{    
       final focus = FocusNode();
       @override
       Widget build(BuildContext context) {
        return Form(
          child: SingleChildScrollView(
            padding: EdgeInsets.symmetric(horizontal: 16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                TextFormField(
                  textInputAction: TextInputAction.next,
                  autofocus: true,
                  decoration: InputDecoration(labelText: "Input 1"),
                  onFieldSubmitted: (v){
                    FocusScope.of(context).requestFocus(focus);
                  },
                ),
                TextFormField(
                  focusNode: focus,
                  decoration: InputDecoration(labelText: "Input 2"),
                ),
              ],
            ),
          ),
        );
      }
    }
    

Edit: Comme indiqué dans la documentation (flutter.io/docs/cookbook/forms/focus), - nous devons également gérer le cycle de vie de FocusNode. Donc, init FocusNode dans la méthode init () et disposer dans dispose () du Widget parent. - @AntonDerevyanko

25
Harsh Bhikadia