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

3voto

tewshi Points 535

Après avoir combiné différentes solutions, j'ai obtenu ceci :

si vous ne voulez pas que ce soit Plein écran et ne veulent pas utiliser le Rembourrage utilisation de la solution de contournement

  showModalBottomSheet(
      context: context,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
      ),
      enableDrag: true,
      isDismissible: true,
      useRootNavigator: true,
      builder: (BuildContext ctx) {
        return Scaffold( // use CupertinoPageScaffold for iOS
          backgroundColor: Colors.transparent,
          resizeToAvoidBottomInset: true, // important
          body: SingleChildScrollView(
            child: Form(
              child: Container(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.stretch,
                  children: <Widget>[
                    TextFormField(),
                    TextFormField(),
                  ],
                ),
              ),
            ),
          ),
        );
      },
    );

sur Flutter (Channel master, v1.15.3-pre.37, sur Mac OS X 10.15.2 19C57, locale en-US)

2voto

MFC creations Points 21

Enveloppez le Form avec un Scaffold puis d'envelopper le widget TextFormField avec un SingleChildScrollView :

 return Container(
          height: screenHeight * .66,
          child: Scaffold(
             body: Form(
               key: _form,
               child: SingleChildScrollView(
                 child:TextFormField()
               )
              )
             )
           )

0 votes

Scaffold(child: ?

2voto

nipunravisara Points 928

Comptez sur github

Padding(
  padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
  child: TextField()
)

1 votes

Cela a fonctionné pour moi

2voto

pawan kumar Points 31

Si vous n'avez toujours pas trouvé votre problème. Alors je pense que vous avez manqué dans votre BuilderContext . Parfois, lorsque vous implémentez modalBottomSheet, cela ne vous donnera que la fonction contexte paramètre. Ajoutez donc le contexte avec BuildContext.

 builder: (BuildContext context) {  //-Here is your issue add BuilderContext class name as it as 
          return Padding(
            padding: MediaQuery.of(context).viewInsets,
            child: SingleChildScrollView(
              child: Padding(
                padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
                child: new Container(

1voto

AkashGiri Points 41
showModalBottomSheet(
 isScrollControlled: true,
 builder: (BuildContext context) {

    return SingleChildScrollView(
      child: Container(
        padding:
            EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
        child: Padding(
          padding: const EdgeInsets.all(15.0), // content padding
          child: Container())});

Note : Cette ligne fait toute la magie

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