showAutoCompleteSelectionList<T> function

dynamic showAutoCompleteSelectionList<T>(
  1. BuildContext context, {
  2. FocusNode? focusNode,
  3. required Future<List<T>> asyncItems(
    1. String query
    ),
  4. required String itemText(
    1. T item
    ),
  5. required dynamic onSelect(
    1. T item
    ),
  6. Widget itemWidget(
    1. dynamic item
    )?,
  7. Widget leadingIcon(
    1. T item
    )?,
})

Implementation

showAutoCompleteSelectionList<T>(
  BuildContext context, {
  FocusNode? focusNode,
  required Future<List<T>> Function(String query) asyncItems,
  required String Function(T item) itemText,
  required Function(T item) onSelect,
  Widget Function(dynamic item)? itemWidget,
  Widget Function(T item)? leadingIcon,
}) async {
  var inputController = TextEditingController();
  var filteredListController = PlexWidgetController<List<T>>(data: List.empty());

  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) async {
                  var query = data;
                  if (query.length < 2) {
                    return;
                  }
                  var filteredList = await asyncItems.call(query);
                  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),
                          leading: leadingIcon?.call(item),
                          title: Text(itemText.call(item)),
                          onTap: () {
                            onSelect.call(item);
                            Get.back();
                          },
                        );
                      },
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      );
    },
  );
}