63 votes

Comment faire un dialogue en plein écran dans flutter ?

Je veux créer une boîte de dialogue en plein écran. Le fond de la boîte de dialogue doit être opaque. Voici un exemple : enter image description here

Comment faire comme ça dans Flutter ?

0 votes

Il faut vérifier ceci, voici le code exact pour créer ceci :- stackoverflow.com/a/63086354/10563627

89voto

boformer Points 8206

Vous pouvez utiliser le Navigator pour pousser une image semi-transparente ModalRoute :

import 'package:flutter/material.dart';

class TutorialOverlay extends ModalRoute<void> {
  @override
  Duration get transitionDuration => Duration(milliseconds: 500);

  @override
  bool get opaque => false;

  @override
  bool get barrierDismissible => false;

  @override
  Color get barrierColor => Colors.black.withOpacity(0.5);

  @override
  String get barrierLabel => null;

  @override
  bool get maintainState => true;

  @override
  Widget buildPage(
      BuildContext context,
      Animation<double> animation,
      Animation<double> secondaryAnimation,
      ) {
    // This makes sure that text and other content follows the material style
    return Material(
      type: MaterialType.transparency,
      // make sure that the overlay content is not cut off
      child: SafeArea(
        child: _buildOverlayContent(context),
      ),
    );
  }

  Widget _buildOverlayContent(BuildContext context) {
    return Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text(
            'This is a nice overlay',
            style: TextStyle(color: Colors.white, fontSize: 30.0),
          ),
          RaisedButton(
            onPressed: () => Navigator.pop(context),
            child: Text('Dismiss'),
          )
        ],
      ),
    );
  }

  @override
  Widget buildTransitions(
      BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
    // You can add your own animations for the overlay content
    return FadeTransition(
      opacity: animation,
      child: ScaleTransition(
        scale: animation,
        child: child,
      ),
    );
  }
}

// Example application:
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Playground',
      home: TestPage(),
    );
  }
}

class TestPage extends StatelessWidget {
  void _showOverlay(BuildContext context) {
    Navigator.of(context).push(TutorialOverlay());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Test')),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Center(
          child: RaisedButton(
            onPressed: () => _showOverlay(context),
            child: Text('Show Overlay'),
          ),
        ),
      ),
    );
  }
}

0 votes

Solution qui fonctionne, merci, Pouvez-vous s'il vous plaît me savoir comment appeler setState(); Cette méthode ne fonctionne pas pour mettre à jour le widget ou existe-t-il un autre moyen de le faire ?

1 votes

setState dans quel widget particulier ? TestPage ? ou à l'intérieur de la superposition ?

0 votes

Ce serait formidable si la réponse pouvait être légèrement mise à jour sur la façon d'utiliser setState à partir de cette nouvelle classe ModalRoute.

71voto

Muhammad Adil Points 121

Voici mon implémentation qui est assez simple.

à partir du premier écran

Navigator.of(context).push(PageRouteBuilder(
    opaque: false,
    pageBuilder: (BuildContext context, _, __) =>
        RedeemConfirmationScreen()));

au 2ème écran

class RedeemConfirmationScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
  backgroundColor: Colors.white.withOpacity(0.85), // this is the main reason of transparency at next screen. I am ignoring rest implementation but what i have achieved is you can see.
.....
  );
 }
}

et voici les résultats.

enter image description here

0 votes

Est-il possible de rendre complètement visible un élément de liste cliqué avec cette modale de recouvrement ?

0 votes

Puisque dans flutter tout est un widget, vous pouvez créer ce que vous voulez à l'intérieur de ce ,

0 votes

@MuhammadAdil Comment avez-vous obtenu ce type d'image ?

47voto

CopsOnRoad Points 4705

Sortie (en utilisant le dialogue natif de Flutter)

enter image description here

Appelez cette méthode pour afficher la boîte de dialogue en plein écran.

showGeneralDialog(
  context: context,
  barrierColor: Colors.black12.withOpacity(0.6), // Background color
  barrierDismissible: false,
  barrierLabel: 'Dialog',
  transitionDuration: Duration(milliseconds: 400), // How long it takes to popup dialog after button click
  pageBuilder: (_, __, ___) {
    // Makes widget fullscreen
    return SizedBox.expand(
      child: Column(
        children: <Widget>[
          Expanded(
            flex: 5,
            child: SizedBox.expand(child: FlutterLogo()),
          ),
          Expanded(
            flex: 1,
            child: SizedBox.expand(
              child: ElevatedButton(
                onPressed: () => Navigator.pop(context),
                child: Text(
                  'Dismiss',
                  style: TextStyle(fontSize: 20),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  },
);

5 votes

Super : Celle-ci est meilleure que les autres réponses... Juste pour savoir, pour quoi vous ajoutez... barrierLabel ?

3 votes

@bloodloss c'est juste la chaîne obligatoire que vous devez fournir pour la fonction d'accessibilité vocale.

23voto

Barlow Tucker Points 1892

Remarque : cette réponse ne traite pas de la transparence de la modale, mais répond à la question posée : "Comment créer une boîte de dialogue en plein écran dans Flutter ? J'espère que cela aidera d'autres personnes qui ont trouvé cette question en effectuant une recherche comme moi, et qui n'ont pas besoin d'une modale transparente.

Créez votre classe de dialogue modal :

class SomeDialog extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Dialog Magic'),
      ),
      body: new Text("It's a Dialog!"),
    );
  }
}

Dans la classe qui doit ouvrir la boîte de dialogue, ajoutez quelque chose comme ceci :

void openDialog() {
  Navigator.of(context).push(new MaterialPageRoute<Null>(
    builder: (BuildContext context) {
      return new SomeDialog();
    },
    fullscreenDialog: true));
}

Si vous avez besoin d'obtenir le résultat d'une action de dialogue, ajoutez un bouton à votre dialogue qui renvoie une valeur lorsque vous ouvrez la pile de navigation. Quelque chose comme ceci :

onPressed: () {
  Navigator
    .of(context)
    .pop(new MyReturnObject("some value");
}

puis, dans votre classe, en ouvrant le dialogue, saisissez les résultats avec quelque chose comme ceci :

void openDialog() async {
  MyReturnObject results = await Navigator.of(context).push(new MaterialPageRoute<MyReturnObject>(
    builder: (BuildContext context) {
      return new SomeDialog();
    },
    fullscreenDialog: true));
}

2voto

Joel jones Points 367
showDialog(
  barrierDismissible: false,
  context: context,
  builder: (BuildContext context) {
    return StatefulBuilder(builder: (context, setState) {
      return AlertDialog(
        insetPadding: EdgeInsets.zero,
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(10.0))),
          content: SizedBox.expand(
            child: Column(
              children: <Widget>[
                SingleChildScrollView(
                    physics: BouncingScrollPhysics(),
                    child: Wrap(
                      children: <Widget>[
                        Row(
                          children: <Widget>[
                            Expanded(
                              flex: 1,
                              child: Text(
                                "Sample type",
                                style: TextStyle(fontWeight: FontWeight.w700),
                              ),
                            ),
                            Expanded(flex: 1, child: Text(""))
                          ],
                        ),
                      ],
                    )),
              ],
            ),
          ));
    });
  },
);

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