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