getValuesPicker method

Widget getValuesPicker(
  1. List? items
)

Implementation

Widget getValuesPicker(List? items) {
  AnythingPickerOptions options = getOptions;

  int length = items?.length ?? 0;
  List<Widget> children = [];
  for (int i = 0; i < length; i++) {
    dynamic e = items!.elementAt(i);
    String itemName = itemDisplayName(i, e);

    _itemOnTap() {
      bool isItemSelected = itemIsSelected(i, e);
      bool isItemDisabled = itemIsDisabled(i, e);

      if (isItemDisabled) {
        return;
      }
      if (widget.funcOfItemOnTapped?.call(this, i, e) ?? false) {
        // handle by caller already if return true
      } else {
        // handle by default if return false or null
        if (widget.selectedValues != null) {
          // Multi-choice. Note: if funcOfItemOnTapped call and return false, u should ensure that selectedValues changed is correct
          isItemSelected ? widget.selectedValues?.remove(e) : widget.selectedValues?.add(e);
        } else {
          // Single-selection. Dismiss by default
          widget.selectedValue = e;
          DialogWrapper.dismissTopDialog();
        }
        // update whole display content widget.
        refresh();
      }
    }

    _itemBuilder() {
      bool isItemSelected = itemIsSelected(i, e);
      bool isItemDisabled = itemIsDisabled(i, e);

      List<Widget> children = [];

      // prefix
      if (options.itemPrefixWidget != null) {
        children.add(options.itemPrefixWidget!);
      }

      // 1. text widget
      TextStyle? itemNameStyle = options.itemStyleNormal;
      if (isItemSelected) {
        itemNameStyle = options.itemStyleSelected;
      } else if (isItemDisabled) {
        itemNameStyle = options.itemStyleDisabled;
      }
      Widget itemTextWidget = Expanded(
        child: Text(
          itemName,
          style: itemNameStyle,
          maxLines: options.itemMaxLines,
        ),
      );
      children.add(itemTextWidget);

      // 2. checkbox widget
      if (widget.selectedValues != null) {
        Widget itemCheckedWidget = Offstage(
          offstage: !isItemSelected,
          child: options.itemCheckedWidget,
        );
        children.add(itemCheckedWidget);
      }

      // suffix
      if (options.itemSuffixWidget != null) {
        children.add(options.itemSuffixWidget!);
      }

      widget.builderOfItemChildren?.call(this, i, e, children);

      // 3. item container
      Decoration? decoration = options.itemDecorationNormal;
      if (isItemDisabled) {
        decoration = options.itemDecorationDisabled;
      } else if (itemIsTapping(i)) {
        decoration = options.itemDecorationTapped;
      }
      return Container(
        width: options.itemWidth,
        height: options.itemHeight,
        margin: options.itemMargin,
        padding: options.itemPadding,
        alignment: options.itemAlignment,
        decoration: decoration,
        child: Row(
          children: children,
        ),
      );
    }

    _itemBuilderWrap() {
      return widget.builderOfItemInner?.call(this, i, e) ?? _itemBuilder();
    }

    Widget item = widget.builderOfItemOuter?.call(this, i, e) ??
        CcTapWidget(
          onTap: (state) {
            _itemOnTap();
          },
          builder: (state) {
            tappingIndexes.remove(i);
            if ((state as CcTapState).isTapingDown) {
              tappingIndexes.add(i);
            }
            return _itemBuilderWrap();
          },
        );

    children.add(item);
  }

  if (children.isEmpty && options.itemNoDataWidget != null) {
    return options.itemNoDataWidget!;
  }
  return ListView(shrinkWrap: true, padding: EdgeInsets.zero, children: children);
}