defemz
defemz

Reputation: 581

setState not working from inside AlertDialog

I am trying to call setState inside an AlertDialog, but surprisingly setState is not changing the state variable. The variable (tasbeehChantCanAdd) i want to set from the dialog box is inside the body of the main page(outside the dialog box) This is the code for the alertDialog:

    Future<void> _alertRemoveEntry(BuildContext context, String textToRemove) {
    return showDialog<void>(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return WillPopScope(
            onWillPop: (){},
            child: StatefulBuilder(
              builder: (context, setState) {
                return AlertDialog(
                  shape: const RoundedRectangleBorder(
                    borderRadius: BorderRadius.all(
                      Radius.circular(15.0),
                    ),
                  ),
                  title: const Text('Enter your info',style: TextStyle(fontWeight: FontWeight.normal,fontSize: 14),),
                  content:  Container(
                      height: 150,
                      child: const Text("Sure to remove this?")
                  ),
                  actions: <Widget>[
                    Container(
                      height: 50,
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                          ElevatedButton(
                            style: ElevatedButton.styleFrom(
                              shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(18.0),
                                //side: BorderSide(color: Colors.red)
                              ),
                              primary: Colors.purple,
                            ),
                            child: Text("CANCEL"),
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                          ),

                          Container(
                            width: 20,
                          ),

                          ElevatedButton(
                            style: ElevatedButton.styleFrom(
                              shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(18.0),
                                //side: BorderSide(color: Colors.red)
                              ),
                              primary: Colors.purple,
                            ),

                            child: Text("REMOVE"),
                            onPressed: (){
                              setState((){
                                tasbeehChantCanAdd = "state changed";
                              });
                              ClassHub().myListSharePreference("sptasbeehAddedList", "set", tasbeehChantCanAdd, "");
                              Navigator.of(context).pop();

                            },
                          ),
                        ],),),

                  ],
                );
              },
            ),
          );
        });
  }

Please what am i doing wrong? Any help would be appreciated. Thanks

Upvotes: 1

Views: 1292

Answers (3)

il_boga
il_boga

Reputation: 1513

Are you me from another dimension? Seriously, I just solved the same problem. I don't know if it is the recommended way of setting states on dialog, since the documentation on showDialog mentions something about states, but I solved it this way:

var choice = await showDialog(
        context: context,
        builder: (context) {
          var list = [];
          return StatefulBuilder(builder: (BuildContext context, setState) {
            return AlertDialog(
              [...]
            );
          });
        });

Just put the variables you need to update through setState just before the StatefulBuilder

Upvotes: 0

Md. Yeasin Sheikh
Md. Yeasin Sheikh

Reputation: 63569

The main state class also have setState and while you are using StatefulBuilder it also has setState, being scope priority setState is coming from StatefulBuilder. You can rename it and use

   child: StatefulBuilder(
              builder: (context, setStateSB) {
       ....
             setState((){ /// for state class IU update
                  tasbeehChantCanAdd = "state changed";
                  });
               setStateSB((){ // update Ui inside dialog
                   tasbeehChantCanAdd = "state changed";
                   });
     

Upvotes: 5

Ravindra S. Patil
Ravindra S. Patil

Reputation: 14775

Try to add your AlertDialog widget inside StatefulBuilder hope its helpful to you.

Refer StatefulBuilder here

yourDropdown(BuildContext context) {
 return showDialog(
        context: context,
        builder: (context) {
          return StatefulBuilder(
            builder: (context, StateSetter setState) {
              return AlertDialog(
                 
              );
            },
          );
        },
      );
    }

Refer my answer here

Upvotes: 1

Related Questions