flutter 还有比这更好的方法来控制对话框吗?

mhd8tkvw  于 2023-06-07  发布在  Flutter
关注(0)|答案(3)|浏览(221)

我在屏幕加载时使用对话框。问题是,如果用户关闭对话框,然后触发对话框的弹出功能,那么它将弹出页面而不是对话框。(导航器.pop(上下文)。所以我想出了一个解决方案,使用全局键对话。现在,该函数检测是否安装了全局密钥,否则将弹出。我想知道是否有更好更短的方法。
我使用导航器.pop(上下文)弹出对话框。但如果用户在关闭对话框之前关闭对话框,则弹出的是页面而不是对话框。

void loadingDialog() {
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) {
        return BackdropFilter(
          filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
          child: AlertDialog(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
            key: dashboardLoadingDialogKey,
            backgroundColor: const Color(0xFF15000D),
            content: Container(
              padding: const EdgeInsets.all(15),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                mainAxisSize: MainAxisSize.min,
                children: [
                  const CircularProgressIndicator(
                    color: Colors.amber,
                  ),
                  const SizedBox(height: 20),
                  Text(
                    'LOADING',
                    textAlign: TextAlign.center,
                    style: dialogAmber,
                  ),
                ],
              ),
            ),
          ),
        );
      },
    );
  }

T型

if (response.statusCode == 200 && mounted) {
        // dashboard loading dialog pop
        if (dashboardLoadingDialogKey.currentContext != null &&
            dashboardLoadingDialogKey.currentContext!.mounted) {
          Navigator.of(dashboardLoadingDialogKey.currentContext!).pop();
        }
      }

这是对话框的函数,我使用全局键,这是我弹出它的方式

klsxnrf1

klsxnrf11#

用户不应关闭/弹出加载对话框。因此,我将builder小部件 Package 为WillPopScope,如下所示,以便它只能通过编程方式弹出:

showDialog(
  context: context,
  barrierDismissible: false,
  builder: (BuildContext context) {
    return WillPopScope(
      onWillPop: () async => false,
      child: AlertDialog(
        // ...
      ),
    );
  },
);
jecbmhm3

jecbmhm32#

我建议您不要通过Navigator来执行此操作,而只需使用OverlayStack,并在那里使用bool来指示是否应显示覆盖。与手动推送和弹出对话框相比,这种方法与大多数状态管理系统更兼容。对于用户来说,如果它被相应地设计,它看起来是相同的。

zour9fqk

zour9fqk3#

它将弹出除基本第一路由之外的所有其他路由。如果你使用显示对话框,它会有很大的帮助。如果使用Navigator.pop(context),有时由于用户交互,所有路由都会弹出。

Navigator.popUntil(context, (route) => route.isFirst);

相关问题