flutterdart

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


Solution

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