web-dev-qa-db-ja.com

Flutter-showDialogが終了した後に関数を実行する

特定のポイントに達したときにAlertDialogを作成するアプリがあります。このAlertDialogに、ポイントをリセットするボタンを追加しました。しかし、AlertDialogが閉じられた後、関数を実行する方法がわかりません。誰かがこの問題を解決してくれると助かります。

このコードでAlertDialogを呼び出します。

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

そして、これはAlertDialogのUIを作成する私のコードです。

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")
              ],
            )
        )
      ],
    );
  }
}

誰かがこの問題のXDで私を助けてくれるといいですね

7
user9047282

showDialog()はコールバックを待機でき、Navigator.popは値を返すことができます。代わりに:

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

あなたは使うことができます:

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

ダイアログビルダー/画面で、戻り値をポップするだけです。

Navigator.pop(context, 'success');

そして、returnValを使います。

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

ダイアログが閉じられると、returnValはnullになります。

15
blaneyneil