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

Flutter:通过SlideTransition滑入的Widget无法点击是什么原因?

问题原因
  • Flutter中SlideTransition是基于绘制变换实现的平移效果,只会修改组件的渲染位置,不会改变组件本身的布局位置与命中测试(hitTest)范围。你看到按钮滑入了屏幕,但组件的可点击区域还停留在初始布局的位置,因此只有初始在屏幕内的部分可以响应点击。
解决方案

方案1:改用布局级动画组件(优先推荐)

替换SlideTransition为AnimatedPositioned,该组件属于布局类动画,会在动画过程中实时更新组件的布局位置,点击区域会和渲染位置完全同步。
示例代码适配你的场景:

Stack( // 外层需要用Stack包裹
  children: [
    // 其他页面组件
    AnimatedPositioned(
      duration: const Duration(milliseconds: 300), // 替换为你的动画时长
      right: _isShow ? 16 : -100, // 控制位置:隐藏时right为负让按钮在屏幕外,显示时右对齐留16dp边距,数值可按需调整
      child: Row(
        children: [
          // ... 你的其他Row子组件
          OutlinedButton(
            onPressed: () { print('object'); },
            child: const Text('Start')
          ),
        ]
      ),
    )
  ]
)

方案2:保留SlideTransition时的修复方法

如果必须使用SlideTransition实现效果,只需要将SlideTransition放在一个尺寸覆盖整个动画平移范围的父容器内,保证命中测试可以覆盖到滑入后的按钮区域即可:

Stack(
  children: [
    // 其他页面组件
    Positioned.fill( // 让父容器占满Stack的所有空间,覆盖整个屏幕范围
      child: SlideTransition(
        position: _offsetAnimation,
        child: Align( // 按你的初始位置需求调整对齐方式
          alignment: Alignment.centerRight,
          child: Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              // ... 你的其他Row子组件
              OutlinedButton(
                onPressed: () { print('object'); },
                child: const Text('Start')
              ),
            ]
          ),
        ),
      )
    )
  ]
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:54:05