簡體   English   中英

對話框在flutter中同時打開多次

[英]The dialog box opens multiples time at a same time in flutter

每當我在滾輪上單擊多次時,同時打開多個對話框。 我只是想要,它應該在之前被解雇后開放。

在此處輸入圖片說明

我拍了一張圖像並在上面添加動畫,然后用GestureDetector小部件包裝它。 onTap:事件我調用了為對話框定義的alertDialogBox()方法。 在gif圖片上方觀看,並調用具有特定條件的動畫方法

代碼:

對話框

alertDialogBox(BuildContext context) {
    return showDialog(
       barrierDismissible: false,
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            backgroundColor: Colors.transparent,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(16.0))),
            contentPadding: EdgeInsets.only(top: 10.0),
            content: Stack(
            children: <Widget>[
             ....
          ],
        ),
      );
    });
  }

輪:

GestureDetector(
              child: Container(
                      alignment: Alignment.center,
                      color: Colors.blue,
                      child: new AnimatedBuilder(
                        animation: _animationCtrl,
                        child:  Container(
                          height:MediaQuery.of(context).size.height/2.3,
                          width: MediaQuery.of(context).size.width/1.3,
                          decoration: BoxDecoration(
                            color: Colors.blue,
                            image: DecorationImage(
                              image: AssetImage('assets/wheel.png', ),
                              fit: BoxFit.contain,
                            ),
                              borderRadius: BorderRadius.all(Radius.circular(130.0)),
                          )
                        ),
                        builder: (BuildContext context, Widget _widget) {
                            .......
                        },
                      ),
                    ),
                  onTap: ()async{
                     await Firestore.instance.collection('Users').document(uid).get().then((DocumentSnapshot documnet){
                      getIsSpin=documnet['isSpin'];


                    });

                    if(getIsSpin=="0"){
                         if (!_animationCtrl.isAnimating) {

                         //applying animation
                        }

                       DateTime now = DateTime.now();
                     // String lastSpinTime =DateFormat("yyyy-MM-dd hh:mm:ss").format(now);

                      .....//here updating isSpin value=1 and also updating   spining Date time to firestore

                   }else {
                     oneDayDuration();
                   }


                  }

                )

24 小時后試圖旋轉輪子

oneDayDuration():

void oneDayDuration()async{
int differenceTime;

await({
   ....here fetching last spin date time from firestore});
   ....//here getting difference hours between last spining time and current time

    if(differenceTime>=24){

         await({......//updating ispin=0 to firbase
        })    
        .then((result)  => {


          print("Now you're able to spin"),

        }).catchError((err) => print(err)); 
    }else{
      print("Please wait for 24 hours");

      alertDialogBox(context);
    }
  }
}

也許是因為,您試圖異步顯示對話框,而不必這樣做。 只需刪除async ,在顯示簡單對話框時就沒有必要了。

最好創建一個在if condition運行異步的方法,並在onTap刪除異步。 這將用async分隔對話框代碼。

現在回答這個問題已經太晚了,我遇到了同樣的情況並解決了它。

這是因為每次狀態改變時,都會通過 build 方法調用 alertDialogBox 函數。 您需要通過向“isAlertboxOpened”之類的類添加變量來限制它,並使 alertDialogBox 的打開有條件並避免打開多個對話框。

下面的代碼應該工作

class _MyHomePageState extends State<MyHomePage> {

  bool isAlertboxOpened; // add this

@override
void initState(){
  isAlertboxOpened = false; // add this
}

alertDialogBox(BuildContext context) async {
    setState(() => isAlertboxOpened = true); // add this
    return showDialog(
       barrierDismissible: false,
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            backgroundColor: Colors.transparent,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(16.0))),
            contentPadding: EdgeInsets.only(top: 10.0),
            content: Stack(
            children: <Widget>[
             ....
            // when press ok button on pressed add this
             onPressed:(){
                 // your code
                 setState(() => isAlertboxOpened = false);
                  Navigator.of(context).pop();
              }

          ],
        ),
      );
    });
  }

void oneDayDuration()async{
int differenceTime;

await({
   ....here fetching last spin date time from firestore});
   ....//here getting difference hours between last spining time and current time

    if(differenceTime>=24){

         await({......//updating ispin=0 to firbase
        })    
        .then((result)  => {


          print("Now you're able to spin"),

        }).catchError((err) => print(err)); 
    }else{
      print("Please wait for 24 hours");
      isAlertboxOpened ? (){} : // add this to make this conditional 
      alertDialogBox(context);
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM