Flutter:使用StatefulBuilder中AlertDialog上的OK按钮设置全局变量

m0rkklqb  于 2022-11-30  发布在  Flutter
关注(0)|答案(1)|浏览(149)

如何使用StatefulBuilder中AlertDialog上的OK按钮设置全局变量?
String stringMain = "My String";

Future<String?> dialogChangeMainContent(BuildContext context) {
    return showDialog<String>(
        context: context,
        builder: (BuildContext context) {
          return StatefulBuilder(builder: (context, setState) {
            return AlertDialog(
              title: const Text('AlertDialog Title'),
              content: const Text('AlertDialog description'),
              actions: <Widget>[
                TextButton(
                  onPressed: () {
                    Navigator.pop(context, 'OK');
                    setState(() {
                      // setState2();
                      stringMain = "New String";
                    });
                  },
                  child: const Text('OK'),
                ),
              ],
            );
          });
        });
  }

我把StatefulWidget从StatelessWidget改成了StatefulWidget,但是什么都没有改变。我知道的是问题是因为按钮在StatefulBuilder中。如果使用BLoC等,对于小的应用程序来说太浪费了。

yyyllmsg

yyyllmsg1#

我找到了一个解决问题的方法,从StatefulBuilder的AlertDialog中重新绘制(刷新)Stateless Widget中的文本(或其他小部件)。通过创建一个setState,使用一个不同的名称,例如 setStateTarget。无需重建整个页面,也无需像BLoC那样进行状态管理。我的代码:
String stringMain = "My String";

@override
  Widget build(BuildContext context) {
    return Column(
      // ....
      children: [
        StatefulBuilder(builder: (BuildContext context, setStateTarget) {
          return Column(children: [
            Text(stringMain), //  <--- target
            TextButton(
                onPressed: () => dialogChangeMainContent(context, setStateTarget),
                child: const Text('Show Dialog'))
          ]);
        })
      ],
    );
  }

  Future<String?> dialogChangeMainContent(BuildContext context, StateSetter setStateTarget) {
    return showDialog<String>(
                  context: context,
                  builder: (BuildContext context) {
                    return StatefulBuilder(builder: (context, setState) {
                      return AlertDialog(
                        title: const Text('AlertDialog Title'),
                        content: const Text('AlertDialog description'),
                        actions: <Widget>[
                          TextButton(
                            onPressed: () {
                              Navigator.pop(context, 'OK');
                              setStateTarget(() {
                                // setState2();
                                stringMain = "New String";
                              });
                            },
                            child: const Text('OK'),
                          ),
                        ],
                      );
                    });
                  });
  }

相关问题