FlatButton 클릭시 AlertDialog를 닫는 방법은 무엇입니까?


82

다음이 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있습니까?

답변:


137

Navigator.pop()트릭을해야합니다. 이를 사용하여 대화 상자의 결과를 반환 할 수도 있습니다 (사용자에게 선택 사항을 제공 한 경우).


9
감사합니다. 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

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

나와 함께 일했습니다.


5
수락 된 답변으로 인해 전체 페이지가 사라졌습니다. 이것은 대화 상자를 숨기는 적절한 답변입니다
user969068

5
대화 상자를 닫는 것이 더 나은 방법입니다. 위의 솔루션을 시도했지만 다른보기가 표시되었습니다.
Farhana

3
수락 된 답변으로 인해 내 페이지도 사라졌습니다. 이것은 대화 상자를 숨기는 올바른 답변입니다.
Ben

대답은 여전히 ​​전체보기를 표시합니다.
karrar kazuya

rootNavigator는 무엇입니까?
K Pradeep Kumar Reddy

20
Navigator.pop(_)

나를 위해 일했지만 Flutter Team의 갤러리에는 다음을 사용하는 예제가 포함되어 있습니다.

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

그것도 효과가 있고 나는 그들의지도를 따르고 싶은 유혹을 받는다.


1
다른 .dart 파일에서 Custom AlertDialog를 호출하고 Navigator.of (context, rootNavigator : true) .pop (); 감사합니다.
djalmafreestyler

1
나는 항상 첫 번째 버전을 사용했지만 두 번째 버전이 한 예를 만났지만 첫 번째 버전은 그 아래의 화면을 제거했습니다.
William Terrill

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
  }
});

이 두 줄의 코드의 차이점은 무엇입니까?
K Pradeep Kumar Reddy

@ user3410835 차이가 없습니다. 실제로 Navigator.pop()첫 번째 줄을 호출합니다.
CopsOnRoad

AlertDialog를 dismissable = false로 만드는 방법은 무엇입니까? 따라서 대화 상자 외부의 화면을 클릭해도 대화 상자가 닫히지 않습니다.
K Pradeep Kumar Reddy

@ user3410835에는 barrierDismissibleshowDialog ()의 이름이 지정된 속성 이 있으며이를 false 또는 true로 설정할 수 있습니다.
Prabowo Murti

5

평면 버튼 클릭시 경고 대화 상자를 닫는 예

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'),
      ),

위의 코드에는 대화의 콜백 결과를 제공하는 데 사용되는 두 가지 고유 한 것이 있습니다.

Navigator.of (context) .pop (false)-NO를 눌렀을 때 거짓 값을 반환 Navigator.of (context) .pop (true)-YES를 눌렀을 때 참 값을 반환

이러한 반환 값을 기반으로 외부에서 일부 작업을 수행하거나 대화 상자 상태 값을 유지할 수 있습니다.


pop (false)은 무엇을할까요? 그리고 pop (true)은 무엇을할까요? 어쨌든 두 경우 모두 AlertDialog가 해제되기를 원합니다.
K Pradeep Kumar Reddy

@ user3410835 : 코드를 수정했습니다. 살펴보세요
jitsm555

4

이것은 완벽하게 작동합니다.

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

2

AlertDialog를 비동기 메서드로 래핑하여 정리할 수 있습니다.

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

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

허용되는 답변은 Navigator Class를 사용하여 대화 상자를 닫는 방법을 나타냅니다. Navigator를 사용하지 않고 대화 상자를 닫으려면 버튼의 onPressed 이벤트를 다음과 같이 설정할 수 있습니다.

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

위의 코드가 자명하지 않은 경우 기본적으로 FlatButton의 Parent AlertDialog를 null로 설정하여 해제합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.