showSelectionList<T> function

dynamic showSelectionList<T>(
  1. BuildContext context, {
  2. List<T>? items,
  3. Future<List<T>>? asyncItems,
  4. required String itemText(
    1. T item
    ),
  5. required dynamic onSelect(
    1. T item
    ),
  6. dynamic initialSelected,
  7. FocusNode? focusNode,
  8. Widget itemWidget(
    1. dynamic item
    )?,
  9. Widget leadingIcon(
    1. T item
    )?,
  10. bool onSearch(
    1. String query,
    2. dynamic item
    )?,
})

Implementation

showSelectionList<T>(
  BuildContext context, {
  List<T>? items,
  Future<List<T>>? asyncItems,
  required String Function(T item) itemText,
  required Function(T item) onSelect,
  dynamic initialSelected,
  FocusNode? focusNode,
  Widget Function(dynamic item)? itemWidget,
  Widget Function(T item)? leadingIcon,
  bool Function(String query, dynamic item)? onSearch,
}) async {
  var originalListData = items;
  originalListData ??= await asyncItems;
  if (originalListData == null) throw Exception("Items are null");

  var inputController = TextEditingController();
  var filteredListController = PlexWidgetController<List<T>>(data: originalListData);
  if (focusNode == null) {
    focusNode = FocusNode();
    focusNode.requestFocus();
  }

  // ignore: use_build_context_synchronously
  showModalBottomSheet(
    enableDrag: true,
    showDragHandle: true,
    useSafeArea: true,
    isScrollControlled: true,
    context: context,
    builder: (context) {
      return Padding(
        padding: MediaQuery.of(context).viewInsets,
        child: Container(
          constraints: const BoxConstraints(maxHeight: 500),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              PlexInputWidget<String>(
                title: "Search",
                type: PlexInputWidgetType.typeInput,
                inputController: inputController,
                inputHint: "Search here...",
                inputFocusNode: focusNode,
                inputOnChange: (data) {
                  var query = data.toLowerCase();
                  if (query.isEmpty) {
                    filteredListController.setValue(originalListData!);
                  }
                  var filteredList = originalListData!.where((element) {
                    if (onSearch != null) {
                      return onSearch.call(query, element);
                    }
                    return itemText(element).toLowerCase().contains(query);
                  }).toList();
                  filteredListController.setValue(filteredList);
                },
              ),
              spaceSmall(),
              Expanded(
                child: PlexWidget(
                  controller: filteredListController,
                  createWidget: (con, data) {
                    var listData = data as List<T>;
                    return ListView.builder(
                      physics: const BouncingScrollPhysics(),
                      itemCount: listData.length,
                      itemBuilder: (context, index) {
                        var item = listData[index];
                        if (itemWidget != null) {
                          return InkWell(
                            onTap: () {
                              onSelect.call(item);
                              Get.back();
                            },
                            child: itemWidget.call(item),
                          );
                        }
                        return ListTile(
                          selectedTileColor: Colors.green.withOpacity(0.25),
                          selected: initialSelected != null && itemText.call(item) == itemText.call(initialSelected),
                          leading: leadingIcon?.call(item),
                          title: Text(itemText.call(item)),
                          trailing: initialSelected != null && itemText.call(item) == itemText.call(initialSelected) ? const Icon(Icons.check_circle, color: Colors.green) : null,
                          onTap: () {
                            onSelect.call(item);
                            Get.back();
                          },
                        );
                      },
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      );
    },
  );
}