onEventShowPicker method
Interaction: show the shower !!!
Implementation
DialogShower onEventShowPicker(BuildContext context) {
AnythingPickerOptions options = getOptions;
// wrap content widget x,y,w,h to a rect
RenderBox box = context.findRenderObject()! as RenderBox;
Size size = box.size;
double w = size.width;
double h = size.height;
Offset position = box.localToGlobal(Offset.zero);
double x = position.dx;
double y = position.dy;
Rect rect = Rect.fromLTWH(x, y, w, h);
double? width = w;
double? height = 100;
// set a default max height to picker when is show on top
if (options.stickToSide == AnythingPickerStickTo.top) {
options.pickerMaxHeight ??= y;
}
Boxes<AnythingPickerOptions?> cartonOption = Boxes();
AnythingPickerOptions _getOptions() {
return cartonOption.object ?? options;
}
Widget _wrapWithBubble(DialogShower shower, Widget child) {
AnythingPickerOptions options = _getOptions();
if (options.bubbleTriangleDirection == null) {
return child;
}
shower.containerDecoration = null;
return CcBubbleWidget(
child: child,
bubbleColor: options.bubbleColor,
bubbleRadius: options.bubbleRadius,
bubbleShadowColor: options.bubbleShadowColor,
bubbleShadowRadius: options.bubbleShadowRadius,
bubbleTriangleLength: options.bubbleTriangleLength,
isTriangleOccupiedSpace: options.isTriangleOccupiedSpace,
bubbleTrianglePointOffset: options.bubbleTrianglePointOffset,
bubbleTriangleTranslation: options.bubbleTriangleTranslation,
bubbleTriangleDirection: options.bubbleTriangleDirection ?? CcBubbleArrowDirection.none,
);
}
// show the indicator
double showerWidth = options.pickerWidth ?? math.min(options.pickerMaxWidth ?? width, width);
double showerHeight = options.pickerHeight ?? math.min(options.pickerMaxHeight ?? height, height);
DialogShower shower = DialogShower();
shower.x = x + (options.pickerShowOffsetX ?? 0);
shower.y = _getOnBottomSideShowerY(options, rect); // default load indicator on bottom for AUTO ...
shower.width = showerWidth;
shower.height = showerHeight;
_refreshShowerY(options, shower, rect);
shower.alignment = Alignment.topLeft;
Widget indicator = const CupertinoActivityIndicator();
indicator = _wrapWithBubble(shower, indicator);
// OverlayWidgets.showWithLayerLink(child: indicator, width: showerWidth, layerLink: _layerLink);
DialogWrapper.showWith(shower, indicator);
shower
..barrierDismissible = true
..transitionBuilder = null
..addShowCallBack((shower) {
animationController?.forward();
isFocused.value = true;
})
..addDisposeCallBack((shower) {
animationController?.reverse();
isFocused.value = false;
});
// show the picker list after values returned
() async {
List? items = await widget.funcOfValues?.call() ?? widget.values;
Widget picker = StatefulBuilder(
// key: mPickerKey,
builder: (BuildContext context, StateSetter setState) {
setStateOfPicker = setState;
return widget.builderOfPicker?.call(this, shower, items) ?? getValuesPicker(items);
},
);
if (options.pickerHeight == null) {
// Label A: auto deciding height
shower.height = null;
if (options.stickToSide == AnythingPickerStickTo.top || options.stickToSide == AnythingPickerStickTo.auto) {
shower.y = (options.pickerMarginScreenTop ?? 0);
}
}
shower.builder = (shower) {
// Label B: height determined
if (shower.height != null) {
return _wrapWithBubble(shower, picker);
}
return Offstage(offstage: true, child: _autoSetShowerHY(shower, picker, rect, cartonOption));
};
/// setState when shower's height is resolved
shower.setState();
}();
return shower;
}