Làm thế nào để loại bỏ một AlertDialog trên một nhấp chuột FlatButton?


82

Tôi có những thứ sau đây 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,
                ),
              ],
            ),
        );

Làm thế nào tôi có thể thực hiện _dismissDialog()nói sa thải AlertDialog?

Câu trả lời:


137

Navigator.pop()nên làm thủ thuật. Bạn cũng có thể sử dụng nó để trả về kết quả của hộp thoại (nếu hộp thoại cung cấp cho người dùng các lựa chọn)


9
Cảm ơn bạn, điều đó đã hiệu quả. Gọi Navigator.pop () đóng hộp thoại như mong đợi. OnPressed hiện tại của tôi như sau: onPressed: () => Navigator.pop(context),
Gustash

@Collin, tôi đã tạo một hàm để hiển thị hộp thoại bằng một hàm khác. 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 ('xin chào các bạn'),),);},); } Vui lòng gợi ý cho tôi cách ẩn showdialog này. Cảm ơn.
Kamlesh

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

đã làm việc với tôi.


5
Câu trả lời được chấp nhận đã gây ra toàn bộ trang của tôi biến mất, đây là câu trả lời thích hợp để che giấu một hộp thoại
user969068

5
đó là một cách tiếp cận tốt hơn để đóng hộp thoại, tôi đã thử giải pháp trên nhưng nó lại làm bật chế độ xem khác của tôi.
Farhana

3
Câu trả lời được chấp nhận cũng khiến trang của tôi biến mất, đây là câu trả lời thích hợp để ẩn hộp thoại.
Ben

Câu trả lời vẫn khiến toàn bộ chế độ xem bật lên.
karrar kazuya

rootNavigator là gì?
K Pradeep Kumar Reddy

20
Navigator.pop(_)

đã làm việc cho tôi, nhưng thư viện của Nhóm Flutter chứa một ví dụ sử dụng:

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

mà cũng hoạt động, và tôi bị cám dỗ để làm theo hướng dẫn của họ.


1
Tôi gọi một Custom AlertDialog từ một tệp .dart khác và sử dụng Navigator.of (context, rootNavigator: true) .pop (); đã làm việc cảm ơn.
djalmafreestyler

1
Tôi đã luôn sử dụng phiên bản đầu tiên ... nhưng chỉ gặp một ví dụ trong đó phiên bản thứ hai đã làm, nhưng phiên bản đầu tiên đã xóa màn hình bên dưới nó.
William Terrill

15

Nếu bạn không muốn trả về bất kỳ kết quả nào, hãy sử dụng một trong số chúng:

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

Nhưng nếu bạn muốn trả về một số kết quả, hãy xem phần này

Thí dụ:

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

Sự khác biệt giữa hai dòng mã này là gì ??
K Pradeep Kumar Reddy

@ user3410835 Không có sự khác biệt, thực sự Navigator.pop()gọi dòng đầu tiên.
CopsOnRoad

Làm cách nào để đặt AlertDialog dictable = false? Vì vậy Hộp thoại đó không bị loại bỏ khi tôi nhấp vào màn hình bên ngoài hộp thoại.
K Pradeep Kumar Reddy

@ user3410835 có một thuộc tính được đặt tên barrierDismissiblecho showDialog () và bạn có thể đặt nó thành false hoặc true.
Prabowo Murti

5

Ví dụ về loại bỏ hộp thoại cảnh báo khi nhấp vào nút phẳng

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

Đoạn mã trên có hai thứ duy nhất được sử dụng để cung cấp kết quả gọi lại của hộp thoại

Navigator.of (ngữ cảnh) .pop (false) - trả về giá trị sai khi chúng ta nhấn NO Navigator.of (context) .pop (true) - trả về giá trị true khi chúng ta nhấn YES

Dựa trên giá trị trả về này, chúng tôi có thể thực hiện một số thao tác bên ngoài nó hoặc duy trì giá trị trạng thái hộp thoại


pop (false) sẽ làm gì? và pop (true) sẽ làm gì? Dù sao trong cả hai trường hợp, chúng tôi muốn AlertDialog bị loại bỏ.
K Pradeep Kumar Reddy

@ user3410835: Đã sửa đổi mã, vui lòng xem
jitsm555

4

Điều này hoạt động hoàn hảo

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

2

Bạn có thể bọc AlertDialog của mình trong một phương thức không đồng bộ để làm cho mọi thứ trở nên sạch sẽ.

  _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

Sử dụng Navigator.pop(context);

Thí dụ

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() nếu không, bạn có thể đóng trang nếu bạn điều hướng từ trang Chính đến chi tiết

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

0

Câu trả lời này hoạt động nếu bạn muốn bật hộp thoại và điều hướng đến chế độ xem khác. Phần này ' current_user_location' là chuỗi mà bộ định tuyến cần biết để điều hướng đến chế độ xem nào.

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

0

Tạo một ngữ cảnh riêng cho Hộp thoại cảnh báo sẽ hữu ích.

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

Vui lòng sử dụng mã sau để đóng hộp thoại

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

0

vượt qua nó trong showDialog barrierDismissible : true


0

Điều này đã làm việc cho tôi Navigator.of (context, rootNavigator: true) .pop ('hộp thoại').

Navigator.pop () chỉ đóng trang / màn hình hiện tại.


-3

Câu trả lời được chấp nhận nêu cách loại bỏ một hộp thoại bằng cách sử dụng Lớp dẫn hướng. Để loại bỏ hộp thoại mà không sử dụng Bộ điều hướng, bạn có thể đặt sự kiện onPressed của nút thành như sau:

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

Trong trường hợp đoạn mã trên không tự giải thích, về cơ bản, nó đang đặt Parent AlertDialog của FlatButton thành null, do đó loại bỏ nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.