clickItemIndex<T extends BaseChooseItemModel> static method

void clickItemIndex<T extends BaseChooseItemModel>(
  1. int itemIndex, {
  2. required int maxChooseCount,
  3. required List<T> sourceItems,
  4. required List<T> currentSelectedItems,
  5. required void beyondMaxChooseCount(
    1. int count
    )?,
  6. required void onValueChange(
    1. List<T> selectedItemModels
    ),
})

Implementation

static void clickItemIndex<T extends BaseChooseItemModel>(
  int itemIndex, {
  required int maxChooseCount, // 最大选择数量(1代表单选)
  required List<T> sourceItems,
  required List<T> currentSelectedItems,
  required void Function(int count)? beyondMaxChooseCount,
  required void Function(List<T> selectedItemModels) onValueChange,
}) {
  T item = sourceItems[itemIndex];
  // 1、判断点击是之前选中的还是新选中的
  T? hasChoosedItem;
  try {
    hasChoosedItem =
        currentSelectedItems.firstWhere((element) => element.id == item.id);
  } catch (e) {
    hasChoosedItem = null;
  }
  if (hasChoosedItem != null) {
    // 点击的 item 之前已选中
    currentSelectedItems.remove(hasChoosedItem);
  } else {
    // 点击的 item 之前未选中
    // ① 如果是单选
    if (maxChooseCount == 1) {
      currentSelectedItems.clear();
    } else {
      // ② 多选,如果是执行选中,提前判断是否会超过
      if (currentSelectedItems.length >= maxChooseCount) {
        // 如果是多选又超过最大个数
        beyondMaxChooseCount?.call(currentSelectedItems.length);
        return;
      }
    }
    currentSelectedItems.add(item);
  }
  onValueChange(currentSelectedItems);
}