web-dev-qa-db-fra.com

Flutter - Exécute la fonction après que showDialog soit fermé

J'ai une application qui crée un AlertDialog lorsqu'un certain nombre de points sont atteints. Dans ce AlertDialog, j'ai ajouté un bouton qui devrait réinitialiser les points. Mais je ne sais pas comment exécuter une fonction après la fermeture de AlertDialog. Ce serait bien si quelqu'un pouvait m'aider avec ce problème.

Avec ce code, j'appelle AlertDialog:

Future<Null> gewinner(int gewinner_team, List<String> spieler){
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return GewinnerDialog(gewinner_team,spieler);
        }
    );
  }

Et voici mon code qui crée l'interface utilisateur du AlertDialog:

import 'package:flutter/material.Dart';
import 'spieler_definieren.Dart';

class GewinnerDialog extends StatefulWidget{
  int gewinner_team;
  List<String> spieler;

  GewinnerDialog(this.gewinner_team, this.spieler);

  @override
  State<StatefulWidget> createState() => new _Gewinner(gewinner_team, spieler);
}

class _Gewinner extends State<GewinnerDialog>{
  int gewinner_team;
  List<String> spieler;

  _Gewinner(this.gewinner_team, this.spieler);


  @override
  Widget build(BuildContext context) {
    return new AlertDialog(
      content: new SingleChildScrollView(
        child: new Text("Winner")
      ),
      actions: <Widget>[
        //this FlatButton should reset all the points, that are saved into a List<String>
        // in another class
        new FlatButton(
            onPressed: (){
              Navigator.pop(context);
            },
            child: new Row(
              children: <Widget>[
                Icon(Icons.replay),
                new Text("New Game") 

              ],
            )
        ),
        new FlatButton(
            onPressed: (){
              Navigator.pushReplacement(context, new MaterialPageRoute(builder: (BuildContext context) => new SpielerDefinieren()));
            },
            child: new Row(
              children: <Widget>[
                Icon(Icons.person_add),
                new Text("New Player")
              ],
            )
        )
      ],
    );
  }
}

Ce serait génial si quelqu'un pouvait m'aider avec ce problème XD

7
user9047282

showDialog () peut attendre un rappel et Navigator.pop peut renvoyer une valeur. donc au lieu de:

Future<Null> gewinner(int gewinner_team, List<String> spieler){
   return showDialog(
       ....
   );
}

vous pouvez utiliser:

Future<Null> gewinner(int gewinner_team, List<String> spieler) async {
   String returnVal = await showDialog(
       ....
   );
}

puis dans le générateur/écran de dialogue, vous entrez simplement une valeur de retour:

Navigator.pop(context, 'success');

puis faites avec le returnVal ce que vous souhaitez.

if (returnVal == 'success') {
  ...
}

si la boîte de dialogue est fermée, returnVal sera null.

15
blaneyneil