FlatButtonクリックでAlertDialogを閉じるにはどうすればよいですか?


87

私は以下を持っていますAlertDialog

showDialog(
            context: context,
            child: new AlertDialog(
              title: const Text("Location disabled"),
              content: const Text(
                  """
Location is disabled on this device. Please enable it and try again.
                  """),
              actions: [
                new FlatButton(
                  child: const Text("Ok"),
                  onPressed: _dismissDialog,
                ),
              ],
            ),
        );

どうすれば言ったを_dismissDialog()却下させることができAlertDialogますか?

回答:


151

Navigator.pop()トリックを行う必要があります。これを使用して、ダイアログの結果を返すこともできます(ユーザーに選択肢が表示された場合)


10
ありがとう、それはうまくいきました。Navigator.pop()を呼び出すと、期待どおりにダイアログが閉じます。次のように私の現在のonPressedは次のとおりです。 onPressed: () => Navigator.pop(context),
Gustash

@Collin、別の関数でダイアログボックスを表示する関数を作成しました。void showLoader(context){showDialog(context:context、builder:(BuildContext context){return Container(width:double.infinity、height:double.infinity、decoration:BoxDecoration(color:Colors.black.withOpacity(0.05)、) 、child:Center(child:Text( 'hello friends')、)、);}、); このショーダイアログを非表示にする方法を教えてください。ありがとう。
Kamlesh

私のためにも働いた!
ダニエル

76
Navigator.of(context, rootNavigator: true).pop('dialog')

私と一緒に働いた。


5
受け入れられた回答により、ページ全体が表示されなくなりました。これは、ダイアログを非表示にするための適切な回答です
user9690 6819

6
ダイアログを閉じる方が良いアプローチです。上記の解決策を試していましたが、他のビューが表示されていました。
ファーハナ

3
受け入れられた答えは私のページも消えさせていました、これはダイアログを隠すための正しい答えです。
ベン

答えはまだビュー全体をポップさせます。
karrarkazuya20年

rootNavigatorとは何ですか?
K Pradeep KumarReddy20年

22
Navigator.pop(_)

私のために働いたが、Flutterチームのギャラリーには以下を使用した例が含まれている:

Navigator.of(context, rootNavigator: true).pop()

これも機能し、私は彼らの先導に従うように誘惑されます。


1
別の.dartファイルからカスタムAlertDialogを呼び出し、Navigator.of(context、rootNavigator:true).pop();を使用しています。おかげで働いた。
djalmafreestyler

1
私はいつも最初のバージョンを使用していました...しかし、2番目のバージョンが使用した例に遭遇しましたが、最初のバージョンはその下の画面を削除しました。
ウィリアムテリル

15

結果を返したくない場合は、次のいずれかを使用してください。

Navigator.of(context).pop();
Navigator.pop(context);

しかし、何らかの結果を返したい場合は、これを参照してください

例:

showDialog(
    context: context,
    builder: (_) {
      return AlertDialog(
        title: Text('Wanna Exit?'),
        actions: [
          FlatButton(
            onPressed: () => Navigator.pop(context, false), // passing false
            child: Text('No'),
          ),
          FlatButton(
            onPressed: () => Navigator.pop(context, true), // passing true
            child: Text('Yes'),
          ),
        ],
      );
    }).then((exit) {
  if (exit == null) return;

  if (exit) {
    // user pressed Yes button
  } else {
    // user pressed No button
  }
});

これらの2行のコードの違いは何ですか?
K Pradeep KumarReddy20年

@ user3410835違いはありませんNavigator.pop()。実際には、最初の行を呼び出します。
CopsOnRoad

AlertDialogを却下可能にする方法= false?ダイアログの外側の画面をクリックしてもダイアログが閉じないようにします。
K Pradeep KumarReddy20年

@ user3410835 barrierDismissibleshowDialog()という名前のプロパティがあり、falseまたはtrueに設定できます。
プラボウォムルティ

6

フラットボタンクリックでアラートダイアログを閉じる例

RaisedButton(
        onPressed: () {
          showDialog(
              context: context,
              builder: (context) => AlertDialog(
                    title: Text('Are you sure?'),
                    content: Text('Do you want to remove item?'),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop(false),//  We can return any object from here
                           child: Text('NO')),
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop(true), //  We can return any object from here
                          child: Text('YES'))
                    ],
                  )).then((value) =>
              print('Selected Alert Option: ' + value.toString()));
        },
        child: Text('Show Alert Dialog'),
      ),

上記のコードには、ダイアログのコールバック結果を提供するために使用される2つの固有のものがあります

Navigator.of(context).pop(false)-NOを押したときにfalse値を返しますNavigator.of(context).pop(true)-YESを押したときにtrue値を返します

これらの戻り値に基づいて、それ以外の操作を実行したり、ダイアログのステータス値を維持したりできます。


pop(false)は何をしますか?そしてpop(true)は何をしますか?いずれにせよ、どちらの場合も、AlertDialogを却下する必要があります。
K Pradeep KumarReddy20年

@ user3410835:コードを変更しました。ご覧ください
jitsm5 5520年

4

これは完全に機能します

      RaisedButton(
                child: Text(
                  "Cancel",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
                onPressed: () => Navigator.pop(context),
              ),

2

AlertDialogをasyncメソッドでラップして、物事をきれいにすることができます。

  _showAlertConfirmDelete() async {
    // the response will store the .pop value (it can be any object you want)
    var response = await showDialog(
        context: context,
        builder: (context) => AlertDialog(
              title: Text('Warn'),
              content: Text('Really wants to remove the record?'),
              actions: <Widget>[
                FlatButton(
                    onPressed: () => Navigator.of(context)
                        .pop(false), 
                    child: Text('No')),
                FlatButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: Text('Yes'))
              ],
            ));
    // do you want to do with the response.
    print(response);
  }

1

使用する Navigator.pop(context);

showDialog(
            context: context,
            child: new AlertDialog(
              title: const Text("Location disabled"),
              content: const Text(
                  """
Location is disabled on this device. Please enable it and try again.
                  """),
              actions: [
                new FlatButton(
                  child: const Text("Ok"),
                  onPressed: () {
                      Navigator.pop(context);
                    },
                ),
              ],
            ),
        );

1

Navigator.of(dialogContext).pop() それ以外の場合は、マスターページから詳細ページに移動した場合にページを閉じることができます

                showDialog(
                  context: context,
                  builder: (dialogContext) {
                    return Dialog(
                      child: Column(
                        children: [
                          Text("Content"),
                          RaisedButton(
                            onPressed: () => Navigator.of(dialogContext).pop(),
                            child: Text("Close"),
                          )
                        ],
                      ),
                    );
                  },
                );

1

一般的にNavigator.pop(context);動作します。

ただし、アプリケーションに複数のNavigatorオブジェクトdialogBoxがあり、閉じない場合は、これを試してください

Navigator.of(context, rootNavigator: true).pop();

結果呼び出しを渡したい場合は、試してください

Navigator.pop(context,result);

または

Navigator.of(context, rootNavigator: true).pop(result)

0

この回答は、ダイアログをポップして別のビューに移動する場合に機能します。この部分 ' current_user_location'は、ルーターがナビゲートするビューを知るために必要な文字列です。

FlatButton(
           child: Text('NO'),
           onPressed: () {
             Navigator.popAndPushNamed(context, 'current_user_location');
              },
           ),

0

アラートダイアログ用に別のコンテキストを作成すると役立ちます。

showDialog(
  context: context,
  builder: (alertContext) => AlertDialog(
    title: const Text("Location disabled"),
    content: const Text(
        """Location is disabled on this device. Please enable it and try again."""),
    actions: [
      new FlatButton(
        child: const Text("Ok"),
        onPressed: () => Navigator.pop(alertContext),
      ),
    ],
  ),
);

0

ダイアログを閉じるコードについては、以下を使用してください

RaisedButton(
     onPressed: () { Navigator.of(context).pop();},
     child: Text("Close",style: TextStyle(color: Colors.white), ),
                color: Colors.black,
           )


0

これは私にとってはうまくいきました。Navigator.of(context、rootNavigator:true).pop( 'dialog')。

Navigator.pop()は、現在のページ/画面を閉じるだけです。


-3

受け入れられた回答は、ナビゲータークラスを使用してダイアログを閉じる方法を示しています。ナビゲーターを使用せずにダイアログを閉じるには、ボタンのonPressedイベントを次のように設定します。

setState((){
  thisAlertDialog = null; 
});

上記のコードが自明でない場合は、基本的にFlatButtonのParent AlertDialogをnullに設定しているため、これを閉じています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.