openPopup method

Future<void> openPopup()

Implementation

Future<void> openPopup() {
  assert(_dropdownRoute == null, 'You can not open a popup twice.');
  final NavigatorState navigator = Navigator.of(context);
  final RenderBox itemBox = context.findRenderObject()! as RenderBox;
  Offset leftTarget = itemBox.localToGlobal(
    itemBox.size.centerLeft(Offset.zero),
    ancestor: navigator.context.findRenderObject(),
  );
  Offset centerTarget = itemBox.localToGlobal(
    itemBox.size.center(Offset.zero),
    ancestor: navigator.context.findRenderObject(),
  );
  Offset rightTarget = itemBox.localToGlobal(
    itemBox.size.centerRight(Offset.zero),
    ancestor: navigator.context.findRenderObject(),
  );

  assert(debugCheckHasDirectionality(context));

  final directionality = Directionality.of(context);
  // The target according to the current directionality.
  final Offset directionalityTarget = () {
    switch (widget.placement) {
      case ToolbarPopupPlacement.start:
        if (directionality == TextDirection.ltr) {
          return leftTarget;
        } else {
          return rightTarget;
        }
      case ToolbarPopupPlacement.end:
        if (directionality == TextDirection.ltr) {
          return rightTarget;
        } else {
          return leftTarget;
        }
      case ToolbarPopupPlacement.center:
        return centerTarget;
    }
  }();

  // The placement according to the current directionality.
  final ToolbarPopupPlacement directionalityPlacement = () {
    switch (widget.placement) {
      case ToolbarPopupPlacement.start:
        if (directionality == TextDirection.rtl) {
          return ToolbarPopupPlacement.end;
        }
        continue next;
      case ToolbarPopupPlacement.end:
        if (directionality == TextDirection.rtl) {
          return ToolbarPopupPlacement.start;
        }
        continue next;
      next:
      default:
        return widget.placement;
    }
  }();

  final Rect itemRect = directionalityTarget & itemBox.size;
  _dropdownRoute = _ToolbarPopupRoute<T>(
    target: directionalityTarget,
    placementOffset: directionalityTarget,
    placement: directionalityPlacement,
    position: widget.position,
    content: _ToolbarPopupContentManager(content: widget.content),
    buttonRect: itemRect,
    elevation: 4,
    capturedThemes: InheritedTheme.capture(
      from: context,
      to: navigator.context,
    ),
    transitionAnimationDuration: const Duration(milliseconds: 100),
    verticalOffset: widget.verticalOffset,
    horizontalOffset: widget.horizontalOffset,
    barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
  );
  return navigator.push(_dropdownRoute!).then((T? newValue) {
    removeToolbarPopupRoute();
    if (!mounted || newValue == null) return;
  });
}