Bir FlatButton tıklamasında bir AlertDialog'u nasıl kapatırım?


87

Aşağıdakilere sahibim 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,
                ),
              ],
            ),
        );

Nasıl _dismissDialog()işten çıkarılsın dedirtebilirim AlertDialog?

Yanıtlar:


151

Navigator.pop()hile yapmalı. Bunu, iletişim kutusunun sonucunu döndürmek için de kullanabilirsiniz (kullanıcıya seçenekler sunmuşsa)


10
Teşekkürler, işe yaradı. Navigator.pop () 'un çağrılması, iletişim kutusunu beklendiği gibi kapatır. Şu anki onPressed şu şekilde: onPressed: () => Navigator.pop(context),
Gustash

@Collin, iletişim kutusunu başka bir işlevle göstermek için bir işlev oluşturdum. void showLoader (bağlam) {showDialog (bağlam: bağlam, oluşturucu: (BuildContext bağlam) {dönüş Kapsayıcı (genişlik: double.infinity, yükseklik: double.infinity, dekorasyon: BoxDecoration (renk: Colors.black.withOpacity (0.05),) , çocuk: Merkez (çocuk: Metin ('merhaba arkadaşlar'),),);},); } Lütfen bana bu gösteri iletişim kutusunu nasıl gizleyebileceğimi önerin. Teşekkürler.
Kamlesh

Benim için de çalıştı!
Daniel

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

benimle çalıştı.


5
Kabul edilen cevap tüm sayfamın kaybolmasına neden oluyordu, bu bir iletişim kutusunu gizlemek için doğru cevap
user969068

6
diyaloğu kapatmak için daha iyi bir yaklaşım, yukarıdaki çözümü deniyordum ama diğer görüşümü ortaya çıkarıyordu.
Farhana

3
Kabul edilen yanıt, sayfamın da kaybolmasına neden oluyordu, bu bir iletişim kutusunu gizlemek için uygun yanıttır.
Ben

Cevap hala tüm görünümün ortaya çıkmasına neden oluyor.
karrar kazuya

rootNavigator nedir?
K Pradeep Kumar Reddy

22
Navigator.pop(_)

benim için çalıştı, ancak Flutter Ekibinin galerisi şunları kullanan bir örnek içeriyor:

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

bu da işe yarıyor ve onların liderliğini takip etme eğilimindeyim.


1
Başka bir .dart dosyasından Custom AlertDialog çağırıyorum ve Navigator.of (context, rootNavigator: true) .pop (); çalıştı teşekkürler.
djalmafreestyler

1
Her zaman ilk sürümü kullanmıştım ... ama sadece ikincisinin kullandığı bir örnekle karşılaştım, ancak ilki altındaki ekranı kaldırdı.
William Terrill

15

Herhangi bir sonuç döndürmek istemiyorsanız ikisinden birini kullanın:

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

Ancak bir sonuç döndürmek istiyorsanız, buna bakın

Misal:

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

Bu iki kod satırı arasındaki fark nedir?
K Pradeep Kumar Reddy

@ user3410835 Fark yok, aslında Navigator.pop()ilk satırı arıyor.
CopsOnRoad

AlertDialog nasıl kapatılabilir = false? Böylece iletişim kutusunun dışındaki ekrana tıkladığımda Diyalog kapatılmıyor.
K Pradeep Kumar Reddy

@ user3410835 barrierDismissibleshowDialog () için adlandırılmış bir özellik vardır ve bunu false veya true olarak ayarlayabilirsiniz.
Prabowo Murti

6

Düz düğme tıklamasında uyarı iletişim kutusunun kapatılmasına örnek

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

Yukarıdaki kod, iletişim kutusunun geri arama sonucunu sağlamak için kullanılan iki benzersiz şeye sahiptir.

Navigator.of (bağlam) .pop (false) - NO Navigator.of (bağlam) .pop (true) düğmesine bastığımızda yanlış değer döndür - EVET'e bastığımızda doğru değeri döndür

Bu dönüş değerine dayanarak, bunun dışında bir işlem yapabilir veya diyalog durum değerini koruyabiliriz


pop (false) ne yapacak? ve pop (true) ne yapacak? Her iki durumda da AlertDialog'un kapatılmasını istiyoruz.
K Pradeep Kumar Reddy

@ user3410835: Kod değiştirildi, lütfen bir göz atın
jitsm555

4

Bu Prefectly çalışır

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

2

Her şeyi temiz hale getirmek için AlertDialog'unuzu zaman uyumsuz bir yöntemle sarmalayabilirsiniz.

  _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

Kullanım Navigator.pop(context);

Misal

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() aksi takdirde Ana sayfadan Ayrıntı sayfasına giderseniz sayfayı kapatabilirsiniz

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

1

Genellikle Navigator.pop(context);işe yarar.

Ancak uygulamanın birden fazla Navigator nesnesi varsa ve dialogBoxkapanmıyorsa, şunu deneyin:

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

Sonuç aramasını geçmek istiyorsanız, deneyin

Navigator.pop(context,result);

VEYA

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

0

Bu cevap, diyaloğu açıp başka bir görünüme geçmek isterseniz işe yarar. Bu bölüm ' current_user_location', yönlendiricinin hangi görünüme gidileceğini bilmesi gereken dizedir.

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

0

Uyarı Diyaloğu için ayrı bir bağlam oluşturmak yardımcı olacaktır.

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

İletişim kutusunu kapatmak için kod için lütfen aşağıdakileri kullanın

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


0

Bu benim için çalıştı Navigator.of (bağlam, rootNavigator: true) .pop ('dialog').

Navigator.pop () sadece geçerli sayfayı / ekranı kapatır.


-3

Kabul edilen yanıt, Navigator Sınıfı kullanılarak bir iletişim kutusunun nasıl kapatılacağını belirtir. Navigator kullanmadan bir diyaloğu kapatmak için, düğmenin onPressed olayını şu şekilde ayarlayabilirsiniz:

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

Yukarıdaki kodun kendi kendini açıklayıcı olmaması durumunda, temelde FlatButton'un Parent AlertDialog'unu null olarak ayarlıyor, böylece onu yok sayıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.