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

Flutter使用go_router如何避免重复推页并保留水波纹效果

解决方法

方法一:用防抖函数限制重复触发

写一个简单的防抖工具函数,确保150ms内只会执行一次跳转逻辑,刚好匹配水波纹的延迟时长,双击操作也只会触发一次跳转。

先定义防抖函数:

Function debounce(Function func, Duration delay) {
  Timer? timer;
  return () {
    if (timer != null) timer!.cancel();
    timer = Timer(delay, () => func());
  };
}

在页面中初始化防抖后的跳转方法:

final navigateToSample = debounce(() {
  context.push("/SampleNextPage");
}, const Duration(milliseconds: 150));

修改按钮的onTap逻辑:

onTap: () {
  // 水波纹效果立即触发,防抖后的跳转只会执行一次
  navigateToSample();
},

方法二:跳转前检查当前路由路径

在延迟执行跳转前,先判断当前页面是否已经是目标页面,避免重复推入栈。

修改onTap逻辑:

onTap: () {
  Future.delayed(const Duration(milliseconds: 150), () {
    final currentPath = GoRouter.of(context).location;
    // 当前路径不是目标页面时才跳转
    if (currentPath != "/SampleNextPage") {
      context.push("/SampleNextPage");
    }
  });
},

方法三:用状态变量控制按钮可点击状态

给页面添加一个状态变量标记是否正在导航,点击时先判断状态,防止重复触发。

如果是StatefulWidget,代码如下:

bool _isNavigating = false;

// 修改按钮的onTap
onTap: () {
  if (_isNavigating) return;
  _isNavigating = true;
  
  Future.delayed(const Duration(milliseconds: 150), () {
    context.push("/SampleNextPage").then((_) {
      // 页面返回后恢复按钮可点击状态
      _isNavigating = false;
    });
  });
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:05:35