onEventShowPicker method

DialogShower onEventShowPicker(
  1. BuildContext context
)

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;
}