Невозможно использовать setState () вне каркаса во флаттере - PullRequest
0 голосов
/ 05 августа 2020

Я создал один метод вне каркаса в методе сборки, но не могу использовать setState () оттуда. Я написал такой код:

    @override
      Widget build(BuildContext context) {
    
    //Method that returns alert dialog
    method(){
       setState(() {
          selectedType = newValue;
          enableBrand = true;
       });
    }
    
    //Main scaffold from where i'm calling the alert dialog method
    return scaffold()
    
    }

Но это не работает, состояние не обновляется, так что кто-нибудь может предложить, в чем проблема?

Я хочу показать AlertDialog при нажатии кнопки, поэтому я создал метод для этого в методе сборки и пытаюсь установить оттуда setState (), но он не работает.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 августа 2020
  void _showDialog() {
showDialog(
  context: context,
  builder: (context) {
    return StatefulBuilder( // StatefulBuilder
      builder: (context, setState) {
        return AlertDialog(
          actions: <Widget>[
          
          ],
        );
      },
    );
  },
);

}

0 голосов
/ 05 августа 2020

Прежде всего, расширяется ли ваш класс StatefulWidget?

В onPressed вашей кнопки вы можете сделать что-то вроде этого примера. AlertDialog может возвращать значение при открытии. Я просто взял пример Alertdialog и вернул String.

Затем вы можете установить свое состояние с новым значением.

onPressed: () async {
                var newValue = await showDialog(
                    context: context,
                    builder: (c) => AlertDialog(
                          title: Text('AlertDialog Title'),
                          content: SingleChildScrollView(
                            child: ListBody(
                              children: <Widget>[
                                Text('This is a demo alert dialog.'),
                                Text(
                                    'Would you like to approve of this message?'),
                              ],
                            ),
                          ),
                          actions: <Widget>[
                            FlatButton(
                              child: Text('Approve'),
                              onPressed: () {
                                Navigator.of(context).pop("YOUR_NEW_VALUE");
                              },
                            ),
                          ],
                        ));

                  //newValue now has the value "YOUR_NEW_VALUE"

                  setState((){
                    selectedType = newValue;
                    enableBrand = true;
                  });
              }

...