fix: More fixes custom tooltip

This commit is contained in:
PartyDonut 2025-07-31 20:26:40 +02:00
parent b9e9b50d72
commit da8a729b9e

View file

@ -26,39 +26,23 @@ enum TooltipPosition { top, bottom, left, right }
class CustomTooltipState extends State<CustomTooltip> {
OverlayEntry? _overlayEntry;
Timer? _timer;
Timer? _tooltipTimer;
final GlobalKey _tooltipKey = GlobalKey();
Timer? _timeOut;
void _resetTimer() {
_timeOut?.cancel();
_timeOut = Timer(const Duration(seconds: 2), () {
_hideTooltip();
_timeOut = null;
});
}
void _showTooltip() {
_timer = Timer(widget.showDelay, () {
_overlayEntry ??= _createOverlayEntry();
if (_overlayEntry != null) {
_tooltipTimer?.cancel();
_tooltipTimer = Timer(widget.showDelay, () {
if (_overlayEntry == null) {
_overlayEntry = _createOverlayEntry();
Overlay.of(context).insert(_overlayEntry!);
}
});
_timeOut = Timer(const Duration(seconds: 2), () {
_hideTooltip();
_timeOut = null;
});
}
void _hideTooltip() {
_timer?.cancel();
_timeOut?.cancel();
if (_overlayEntry?.mounted == true) {
_tooltipTimer?.cancel();
_overlayEntry?.remove();
}
_overlayEntry = null;
}
@ -67,7 +51,8 @@ class CustomTooltipState extends State<CustomTooltip> {
Offset targetPosition = renderBox.localToGlobal(Offset.zero);
Size targetSize = renderBox.size;
WidgetsBinding.instance.addPostFrameCallback((_) {
return OverlayEntry(
builder: (context) {
final tooltipRenderBox = _tooltipKey.currentContext?.findRenderObject() as RenderBox?;
if (tooltipRenderBox != null) {
Size tooltipSize = tooltipRenderBox.size;
@ -100,25 +85,17 @@ class CustomTooltipState extends State<CustomTooltip> {
break;
}
_overlayEntry = OverlayEntry(
builder: (context) => Positioned(
return Positioned(
left: tooltipPosition.dx,
top: tooltipPosition.dy,
child: Material(
color: Colors.transparent,
child: widget.tooltipContent,
),
),
);
if (_overlayEntry != null) {
Overlay.of(context).insert(_overlayEntry!);
}
}
});
return OverlayEntry(
builder: (context) => const SizedBox.shrink(),
return const SizedBox.shrink();
},
);
}
@ -128,7 +105,6 @@ class CustomTooltipState extends State<CustomTooltip> {
return MouseRegion(
onEnter: (_) => _showTooltip(),
onExit: (_) => _hideTooltip(),
onHover: (_) => _resetTimer(),
child: Stack(
children: [
widget.child,
@ -147,8 +123,8 @@ class CustomTooltipState extends State<CustomTooltip> {
@override
void dispose() {
_timer?.cancel();
_overlayEntry?.remove();
_tooltipTimer?.cancel();
_hideTooltip(); // Ensure the tooltip is hidden on dispose
super.dispose();
}
}