openPopup method
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;
});
}