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
相关产品推荐
相关产品推荐

