dart 弹出上下文时黑屏

nr7wwzry  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(81)
Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          appBar: AppBar(title: const Text("Configurações")),
          body: ListView(
            children: [
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20),
                child: TextField(
                  controller: usernameController,
                  decoration: const InputDecoration(
                      labelText: "Nome de usuário",
                      hintText: "Mudar seu nome de usuário"),
                ),
              ),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20),
                child: TextField(
                  keyboardType: TextInputType.number,
                  controller: heightController,
                  decoration: const InputDecoration(
                      labelText: "Altura", hintText: "Mudar sua altura"),
                ),
              ),
              SwitchListTile(
                  title: const Text("Notifications"),
                  value: hasPushNotificationOn,
                  onChanged: (value) => setState(() {
                        hasPushNotificationOn = value;
                      })),
              SwitchListTile(
                title: const Text("Dark mode"),
                value: isDarkMode,
                onChanged: (value) => setState(() {
                  isDarkMode = value;
                }),
              ),
              FloatingActionButton(
                  onPressed: () async {
                    try {
                      await storage.setDouble(
                          K_HEIGHT, double.parse(heightController.text));
                    } catch (e) {
                      showDialog(
                        context: context,
                        builder: (_) => AlertDialog(
                          title: const Text("Erro"),
                          content: const Text("Altura inválida"),
                          actions: [
                            TextButton(
                                onPressed: () => Navigator.pop(context),
                                child: const Text("Ok"))
                          ],
                        ),
                      );
                    }
                    await storage.setString(
                        K_USERNAME, usernameController.text);
                    await storage.setBool(K_DARK_MODE, isDarkMode);
                    await storage.setBool(
                        K_PUSH_NOTIFICATION, hasPushNotificationOn);
                    Navigator.pop(context);

                    setState(() {
                      username = usernameController.text;
                      height = double.tryParse(heightController.text);
                    });
                  },
                  child: const Icon(Icons.save_as_rounded))
            ],
          )),
    );
  }

这将导致初始代码:

ListTile(
            title: const Row(
              children: [
                Icon(Icons.settings),
                SizedBox(width: 10),
                Text("Configurações"),
              ],
            ),
            onTap: () {
              Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(
                    builder: (context) => const SettingsPage(),
                  ));
            },
          ),

这应该是一个超级简单的配置菜单。当我点击保存图标时,或者当我在这个try catch语句中得到一个错误时,我得到一个完全黑屏,它根本不显示对话框。
是导航仪出问题了吗。爸爸?为什么会这样呢?
另外,我试图通过在floatingButton内的onPressed()之前声明一个变量来从async函数中获取上下文,但它也不起作用。

n6lpvg4x

n6lpvg4x1#

如果您在主页
如果您用途:

pushReplacement

这将用新路由替换当前路由,因此您无法返回。
使用push代替。
https://api.flutter.dev/flutter/widgets/Navigator/push.html
关于为什么你的pop在你的对话框上不起作用的问题,这是因为你使用了错误的上下文。
在这部分代码中。

showDialog(
                        context: context,
                        builder: (_) => AlertDialog(
                          title: const Text("Erro"),
                          content: const Text("Altura inválida"),
                          actions: [
                            TextButton(
                                onPressed: () => Navigator.pop(context),
                                child: const Text("Ok"))
                          ],
                        ),
                      );

您没有显示从对话框生成的“上下文”。

builder: (_)

就换成这个

builder: (context)

相关问题