showSelectionList<T> function
dynamic
showSelectionList<T>(
- BuildContext context, {
- List<
T> ? items, - Future<
List< ? asyncItems,T> > - required String itemText(
- T item
- required dynamic onSelect(
- T item
- dynamic initialSelected,
- FocusNode? focusNode,
- Widget itemWidget(
- dynamic item
- Widget leadingIcon(
- T item
- bool onSearch(
- String query,
- 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();
},
);
},
);
},
),
),
],
),
),
);
},
);
}