237 votes

Comment déplacer la feuille de bas de page avec le clavier qui a un champ de texte (autofocused est vrai) ?

J'essaie de créer une feuille de bas de page avec un champ de texte et l'autofocus est réglé sur true pour que le clavier apparaisse. Mais la feuille de bas de page est recouverte par le clavier. Existe-t-il un moyen de déplacer la feuille de fond au-dessus du clavier ?

Padding(
  padding:
      EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
  child: Column(children: <Widget>[
    TextField(
      autofocus: true,
      decoration: InputDecoration(hintText: 'Title'),
    ),
    TextField(
      decoration: InputDecoration(hintText: 'Details!'),
      keyboardType: TextInputType.multiline,
      maxLines: 4,
    ),
    TextField(
      decoration: InputDecoration(hintText: 'Additional details!'),
      keyboardType: TextInputType.multiline,
      maxLines: 4,
    ),]);

1 votes

Il y a également quelques problèmes ouverts sur Github : question principale y un autre avec un commentaire qui propose une solution animée.

1 votes

Pour moi, cela se règle simplement en ajoutant un Padding comme dernier enfant de l'élément Column et définir son remplissage comme padding: MediaQuery.of(context).viewInsets

6voto

Boris Kamtou Points 106

Essayez ça.

showModalBottomSheet(
        isScrollControlled: true,
        context: context,
        builder: (context) {
          return AnimatedPadding(
              padding: MediaQuery.of(context).viewInsets,
              duration: const Duration(milliseconds: 100),
              curve: Curves.decelerate,
              child: Container(
                  child: Wrap(
                children: [
                  TextField(
                    decoration: InputDecoration(labelText: "1"),
                  ),
                  TextField(
                    decoration: InputDecoration(labelText: "2"),
                  ),
                  TextField(
                    decoration: InputDecoration(labelText: "3"),
                  ),
                ],
              )));
        },
      )

5voto

Pro Co Points 51

Vous devriez l'utiliser alors,

showModalBottomSheet(
    isScrollControlled: true,
    context: context,
    shape: RoundedRectangleBorder(
      // <-- for border radius
      borderRadius: BorderRadius.only(
        topLeft: Radius.circular(10.0),
        topRight: Radius.circular(10.0),
      ),
    ),
    builder: (BuildContext context) {
      return SingleChildScrollView(
        padding:
            EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
        child: drunkenWidget()...

//BTW, Never ever Drink

5voto

Necessary Lion Points 21
showModalBottomSheet(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(15.0),
      ),
      context: context,
      isScrollControlled: true,
      builder: (builder) {
        return Container(
          height: MediaQuery.of(context).size.height - 40,
          padding: MediaQuery.of(context).viewInsets,
          child: <Your Widget Here>,
        );
      },
    );

enter image description here

4voto

frankenstein Points 1037

Si vous êtes en plein écran ou en taille fixe showModalBottomSheet n'utilisez pas padding cela ne résoudra pas votre problème. Utilisez margin au lieu de padding comme ceci :

  showModalBottomSheet(
          context: context,
          builder: (context) {
            return Container(
                marign: EdgeInsets.only(
                    bottom: MediaQuery.of(context).viewInsets.bottom),
                child: TextField()
            );
          });

4voto

Priya Sindkar Points 38

Au lieu d'utiliser builder: (BuildContext context) { } dans le constructeur, utilisez builder: (context) { }

Avec cette solution, ma feuille de fond modale se colle à la barre d'état (agit comme si Scaffold con resizeToAvoidBottomInset: false ) et permet d'afficher tous les champs du formulaire et de faire défiler le formulaire si cela est nécessaire pour afficher les champs de texte inférieurs.

Pour plus de détails, voici le lien d'où j'ai trouvé la solution- https://github.com/flutter/flutter/issues/18564#issuecomment-602604778

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