94 votes

Flutter : Comment modifier la largeur d'un AlertDialog ?

Je me demande comment changer la largeur par défaut d'un AlertDialog, je n'ai réussi qu'à changer le rayon de la bordure :

Voici mon code :

showDialog(
       context: context,
       builder: (_) =>
            new AlertDialog(
               shape: RoundedRectangleBorder(
                   borderRadius: BorderRadius.all(Radius.circular(10.0))
               ),
               content: ProductPreviewScreen(),
            )
    );

Résultat attendu :

enter image description here Any idea?

103voto

user1094821 Points 90

À partir de mai 2020, si vous souhaitez modifier le remplissage d'une boîte de dialogue, il vous suffit d'utiliser la classe Dialog et de remplacer la propriété "insetPadding". Vous pouvez faire en sorte qu'une boîte de dialogue s'étende jusqu'aux bords de l'écran si vous le souhaitez.

Vous pouvez également créer des boîtes de dialogue personnalisées en rendant la surface de la boîte de dialogue transparente, puis en ajoutant les widgets de votre choix. Par exemple :

showDialog(Dialog(
  backgroundColor: Colors.transparent,
  insetPadding: EdgeInsets.all(10),
  child: Stack(
    overflow: Overflow.visible,
    alignment: Alignment.center,
    children: <Widget>[
      Container(
        width: double.infinity,
        height: 200,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(15),
          color: Colors.lightBlue
        ),
        padding: EdgeInsets.fromLTRB(20, 50, 20, 20),
        child: Text("You can make cool stuff!",
          style: TextStyle(fontSize: 24),
          textAlign: TextAlign.center
        ),
      ),
      Positioned(
        top: -100,
        child: Image.network("https://i.imgur.com/2yaf2wb.png", width: 150, height: 150)
      )
    ],
  )
));

Résultats dans :

Dialog example

0 votes

C'est maintenant la bonne solution, les autres ressemblent plus à des bricolages IMO

0 votes

Je souhaite créer un showDialog de taille fixe de 150 x 150 pixels. J'ai mis à jour la largeur et la hauteur du conteneur comme return Container( height : 150, width : 150, ) ; mais cela ne fonctionne toujours pas. J'obtiens une boîte rectangle au ratio 3:2 au lieu d'une boîte carrée.

80voto

Kent Points 1382

C'est beaucoup plus simple que ce que les autres réponses laissent croire. Il suffit d'utiliser un constructeur pour modifier la taille de la boîte de dialogue au fur et à mesure qu'elle est construite (construite, instanciée dans d'autres langues). Cela signifie que vous pouvez également demander la taille de l'écran et décider de l'espace que vous voulez en fonction de cette taille. Par exemple, plus d'espace sur une tablette que sur un téléphone. Vous pouvez faire de Scaffold un enfant du Container si vous avez besoin de la barre d'applications et d'autres fonctions.

showDialog(
  context: context,
  builder: (_) => new AlertDialog(
  shape: RoundedRectangleBorder(
    borderRadius:
      BorderRadius.all(
        Radius.circular(10.0))),
    content: Builder(
      builder: (context) {
        // Get available height and width of the build area of this widget. Make a choice depending on the size.                              
        var height = MediaQuery.of(context).size.height;
        var width = MediaQuery.of(context).size.width;

        return Container(
          height: height - 400,
          width: width - 400,
        );
      },
    ),
  )
);

Exemples de différentes tailles :

enter image description here

enter image description here

enter image description here

Vous pouvez les ajouter pour supprimer les espaces inutiles des bordures intérieures et extérieures.

          insetPadding: EdgeInsets.zero,
          contentPadding: EdgeInsets.zero,
          clipBehavior: Clip.antiAliasWithSaveLayer,

0 votes

Est trop important.

14 votes

Shinriyo en est un exemple. Ne copiez pas exactement la taille, mais modifiez-la pour qu'elle corresponde à vos besoins.

0 votes

Désolé, mais cela ne fonctionne pas pour moi. Merci de votre compréhension.

44voto

CopsOnRoad Points 4705

Utilisation du dialogue intégré :

  • Pour augmenter la largeur :

    AlertDialog(
      title: Text("AlertDialog"),
      insetPadding: EdgeInsets.zero,
    )
  • Pour diminuer la largeur :

    AlertDialog(
      title: Text("AlertDialog"),
      insetPadding: EdgeInsets.symmetric(horizontal: 100),
    )

Utilisation d'un dialogue personnalisé :

enter image description here

Appelez cette méthode :

showGeneralDialog(
  context: context,
  barrierColor: Colors.black.withOpacity(0.5),
  pageBuilder: (_, __, ___) {
    return Material(
      color: Colors.transparent,
      child: Center(
        child: Container(
          color: Colors.white, // Dialog background
          width: 120, // Dialog width
          height: 50, // Dialog height
          child: SingleChildScrollView(
            child: Column(
              children: [
                Text('I am a small Dialog'),
              ],
            ),
          ),
        ),
      ),
    );
  },
);

0 votes

Je veux créer une boîte de dialogue de 200 x 200 pixels. Comment puis-je le faire dans Flutter ? Merci de me le suggérer. Merci.

1 votes

@Kamlesh Pour l'instant, vous ne pouvez pas le faire en utilisant AlertDialog vous devrez créer votre propre widget. Voir cette réponse pour commencer.

0 votes

J'aime les réponses courtes !

21voto

Jerome Escalante Points 2714

Vous pourriez essayer d'envelopper votre widget AlertDialog avec le widget ConstrainedBox comme suggéré dans aquí et définissez la valeur que vous souhaitez pour le paramètre maxWidth.

MISE À JOUR

Je viens de regarder le code du parent du widget AlertDialog qui est le widget Dialog et j'ai découvert qu'il a enveloppé son enfant avec un widget ConstrainedBox avec une largeur minimale de 280 pixels. C'est la raison pour laquelle nous ne pouvons pas modifier la largeur du widget AlertDialog.

Heureusement, il y a deux choses que nous pouvons faire. La première option consiste à modifier la largeur minimale par défaut du widget Dialog dans le fichier dialog.dart. Notez que ce changement affectera tous vos projets Flutter qui utilisent le widget Dialog.

//inside dialog.dart

class Dialog extends StatelessWidget {

...

@override
Widget build(BuildContext context) {
  final DialogTheme dialogTheme = DialogTheme.of(context);
  return AnimatedPadding(
    padding: MediaQuery.of(context).viewInsets + const EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0),
    duration: insetAnimationDuration,
    curve: insetAnimationCurve,
    child: MediaQuery.removeViewInsets(
      removeLeft: true,
      removeTop: true,
      removeRight: true,
      removeBottom: true,
      context: context,
      child: Center(
        child: ConstrainedBox(
          constraints: const BoxConstraints(minWidth: 280.0), // You can set your desired value for minWidth here
          child: Material(
            elevation: 24.0,

            ...

Vous pouvez alors utiliser l'AlertDialog comme suit :

showDialog(
  context: context,
  builder: (_) => AlertDialog(
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.all(Radius.circular(10.0))
      ),
    contentPadding: EdgeInsets.all(0.0),
    content: ProductPreviewScreen(),
    )
  )
);

L'autre moyen serait de créer notre propre dialogue de personnalisation.

showDialog(
  context: context,
  builder: (_) => Center( // Aligns the container to center
    child: Container( // A simplified version of dialog. 
      width: 100.0,
      height: 56.0,
      color: Colors.pink,
      )
    )
 );

0 votes

J'ai essayé d'entourer la ConstrainedBox d'un widget Center ou d'un widget Align. Cela a changé la largeur mais il y a quelque chose qui cloche. J'ai également fixé le paramètre contentPadding de l'AlertDialog à zéro, ce qui a permis d'éliminer le rembourrage par défaut du contenu de l'AlertDialog.

0 votes

@JeromeEscalante J'ai essayé de l'intégrer dans un widget central, avec une minWidth, mais cela ne fonctionne toujours pas la largeur a-t-elle changé lorsque vous avez essayé ?

2 votes

Je ne pense pas que cela soit possible avec le dialogue d'alerte sur les matériaux. Vous pouvez écrire votre propre dialogue pour y parvenir. Je pense que le dialogue d'alerte sur les matériaux est déjà inséré dans un widget de taille fixe.

9voto

BloodLoss Points 542

Utiliser le widget Padding

 Padding(
   padding: EdgeInsets.only(left: 50.0, right: 50.0),
   child://AlertDialog or any other Dialog you can use
         Dialog(
                elevation: 0.0,
                backgroundColor: Colors.transparent,
                child: Container(
                  width: 10.0,
                  height: 50.0,
                  color: Colors.red,
                )
            ))

0 votes

Ajouter une couche supérieure de rembourrage... Padding(padding: "..",child:

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