Flutter桌面(Windows)如何完全禁用Hover效果以消除不必要重绘
你当前通过MaterialStateProperty.resolveWith固定所有状态下的颜色,虽然视觉上看不到hover变化,但ElevatedButton内部仍会监听鼠标hover事件,更新自身的MaterialState.hovered状态并调用setState,这会触发组件重绘,所以toggleRepaintRainbow会标记它。要彻底解决,需要让按钮完全不响应hover事件,避免状态更新和重绘触发。
以下是两种可行方案:
方案1:用Listener包裹按钮,消费Hover事件
通过Listener组件拦截PointerHoverEvent,不让事件传递到ElevatedButton内部,这样按钮不会感知到hover状态变化:
Listener( // 消费hover事件,不向下传递 onPointerHover: (_) {}, child: ElevatedButton( onPressed: () {}, style: ButtonStyle( backgroundColor: colorResolver(Colors.blue), ), child: const Text('无Hover重绘按钮'), ), )
方案2:自定义无Hover的ElevatedButton
重写ElevatedButton的内部状态逻辑,直接忽略hover事件的处理:
class NoHoverElevatedButton extends ElevatedButton { NoHoverElevatedButton({ super.key, required super.onPressed, super.onLongPress, super.style, super.focusNode, super.autofocus = false, super.clipBehavior = Clip.none, required super.child, }); @override State<ElevatedButton> createState() => _NoHoverElevatedButtonState(); } class _NoHoverElevatedButtonState extends State<ElevatedButton> { @override void handleEvent(PointerEvent event, BoxHitTestEntry entry) { // 直接忽略所有hover事件 if (event is PointerHoverEvent) return; super.handleEvent(event, entry); } }
使用时直接替换原ElevatedButton即可:
NoHoverElevatedButton( onPressed: () {}, style: ButtonStyle( backgroundColor: colorResolver(Colors.blue), ), child: const Text('自定义无Hover按钮'), )
如果需要全局禁用所有组件的hover效果,可以考虑通过GestureBinding全局拦截hover事件,但这种方式会影响所有可交互组件,需谨慎使用。
内容的提问来源于stack exchange,提问作者Marwin Lebensky
相关产品推荐
相关产品推荐

