useHoverWidget function

  1. @Deprecated('Use KaeruWidget instead. This will be removed in a future version.')
UseHoverWidgetReturn useHoverWidget({
  1. HoverMode mode = HoverMode.atomic,
})

A hook that provides hover detection for a widget.

Note: This is part of the deprecated defineWidget API.

Implementation

@Deprecated('Use KaeruWidget instead. This will be removed in a future version.')
UseHoverWidgetReturn useHoverWidget({HoverMode mode = HoverMode.atomic}) {
  final isHover = $ref(false);
  final key = GlobalKey();

  void setHover(bool value) {
    isHover.value = value;
  }

  // Determine effective mode
  HoverMode effectiveMode = mode;
  if (mode == HoverMode.atomic) {
    if (defaultTargetPlatform == TargetPlatform.android ||
        defaultTargetPlatform == TargetPlatform.iOS) {
      effectiveMode = HoverMode.touch;
    } else {
      effectiveMode = HoverMode.mouse;
    }
  }

  Widget hoverWrap(WidgetBuilder builder) {
    Widget child = Builder(builder: builder);

    if (effectiveMode == HoverMode.mouse || effectiveMode == HoverMode.both) {
      child = MouseRegion(
        onEnter: (_) => setHover(true),
        onExit: (_) => setHover(false),
        child: child,
      );
    }

    if (effectiveMode == HoverMode.touch || effectiveMode == HoverMode.both) {
      child = Listener(
        key: key,
        onPointerDown: (_) => setHover(true),
        onPointerUp: (_) => setHover(false),
        onPointerCancel: (_) => setHover(false),
        behavior: HitTestBehavior.translucent,
        child: child,
      );
    }

    return child;
  }

  return (
    isHover: isHover,
    hoverWrap: hoverWrap,
  );
}