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

