You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现点击按钮后显示指定时长页面再返回的方法

Flutter实现点击按钮后显示指定时长页面再返回的正确方式

你的代码逻辑顺序存在问题:Navigator.of(context).popUntil是同步执行的,会在延迟的push操作完成前就执行,导致成功页面还没显示就已经执行了返回操作。下面是两种可行的修正方案:

方案一:在成功页面内部实现自动返回(推荐)

把延迟返回的逻辑封装到SuccessMessage页面中,让页面的行为更独立,代码结构更清晰。

修改按钮点击逻辑

onPressed: () {
  // 直接跳转到成功页面,页面关闭后执行指定的返回操作
  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => SuccessMessage(
        title: "Ubah Password Sukses!",
        subtitle: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Consectetur adipiscing elit.",
      ),
    ),
  ).then((_) {
    Navigator.of(context).popUntil((_) => count++ >= 3);
  });
}

修改SuccessMessage页面

class SuccessMessage extends StatefulWidget {
  final String title;
  final String subtitle;

  const SuccessMessage({super.key, required this.title, required this.subtitle});

  @override
  State<SuccessMessage> createState() => _SuccessMessageState();
}

class _SuccessMessageState extends State<SuccessMessage> {
  @override
  void initState() {
    super.initState();
    // 延迟2秒后自动关闭当前页面
    Future.delayed(const Duration(seconds: 2)).then((_) {
      // 加mounted判断,避免页面已销毁时调用Navigator引发错误
      if (mounted) {
        Navigator.of(context).pop();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(widget.title, style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
            const SizedBox(height: 16),
            Text(widget.subtitle),
          ],
        ),
      ),
    );
  }
}

方案二:在当前页面统一处理(不推荐)

如果不想修改SuccessMessage页面,也可以在push完成后串联延迟返回操作,但这种方式会把页面行为逻辑耦合在按钮事件中,健壮性较差:

onPressed: () {
  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => SuccessMessage(
        title: "Ubah Password Sukses!",
        subtitle: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Consectetur adipiscing elit.",
      ),
    ),
  ).then((_) {
    Future.delayed(const Duration(seconds: 2)).then((_) {
      Navigator.of(context).pop();
      Navigator.of(context).popUntil((_) => count++ >= 3);
    });
  });
}

这种方式需要注意页面状态,如果用户手动关闭了成功页面,延迟的操作可能会引发上下文错误。

原代码问题核心

你原来的代码中,异步的Future.delayed还没执行push操作,同步的popUntil就已经修改了页面栈,导致后续的push失去了正确的上下文,成功页面根本无法正常显示。

内容的提问来源于stack exchange,提问作者Quinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:26:05