showOverlay method

void showOverlay(
  1. BuildContext context
)

Loads the tooltip into view

Implementation

void showOverlay(BuildContext context) async
{
  if (overlayEntry != null) return;

  OverlayState? overlayState = Overlay.of(context);

  /// By calling [PositionManager.load()] we get returned the position
  /// of the tooltip, the arrow and the trigger.
  ToolTipElementsDisplay toolTipElementsDisplay = PositionManager(
    showArrow: widget.model.arrow,
    arrowBox: _arrowBox,
    overlayBox: _overlayBox,
    triggerBox: _triggerBox,
    screenSize: _screenSize,
    distance: widget.model.distance,
    radius: widget.model.radius,
  ).load(preferredPosition: widget.position);


  // build the overlay
  List<Widget> children = [];

  // modal curtain
  if (widget.model.modal) children.add(Modal(visible: widget.model.modal, onTap: () => hideOverlay()));

  // bubble
  var bubble = Positioned(
    top:  toolTipElementsDisplay.bubble.y,
    left: toolTipElementsDisplay.bubble.x,
    child: Bubble(
      padding: widget.model.margins,
      radius: toolTipElementsDisplay.radius,
      color: widget.model.color ?? Theme.of(context).colorScheme.surfaceVariant,
      child: widget.content,
    ));
  children.add(bubble);

  // arrow
  var arrow = widget.model.arrow ? Positioned(
    top: toolTipElementsDisplay.arrow.y,
    left: toolTipElementsDisplay.arrow.x,
    child: Arrow(
      color: widget.model.color ?? Theme.of(context).colorScheme.surfaceVariant,
      position: toolTipElementsDisplay.position,
      width: _arrowBox.w,
      height: _arrowBox.h)) : Container();
  children.add(arrow);

  // child
  if (widget.model.modal) {
    children.add(Positioned(
        top: _triggerBox.y,
        left: _triggerBox.x,
        child: view));
  }

  // build overlay
  overlayEntry = OverlayEntry(builder: (context) => Stack(children: children));
  overlayState.insert(overlayEntry!);

  // Add timeout for the tooltip to disappear after a few seconds
  if (widget.model.timeout > 0 && opener != OpenMethods.hover) await Future.delayed(Duration(milliseconds: widget.model.timeout > 0 ? widget.model.timeout : 3000)).whenComplete(() => hideOverlay());
}