diff --git a/lib/src/filter_list_widget.dart b/lib/src/filter_list_widget.dart index 02ffd05..51588a3 100644 --- a/lib/src/filter_list_widget.dart +++ b/lib/src/filter_list_widget.dart @@ -59,7 +59,7 @@ class FilterListWidget extends StatelessWidget { required this.validateSelectedItem, this.validateRemoveItem, required this.choiceChipLabel, - required this.onItemSearch, + this.onItemSearch, this.selectedListData, this.onApplyButtonClick, this.choiceChipBuilder, @@ -81,6 +81,9 @@ class FilterListWidget extends StatelessWidget { ControlButtonType.All, ControlButtonType.Reset ], + this.header, + this.onReset, + this.onSelected, }) : super(key: key); /// Filter theme @@ -112,6 +115,12 @@ class FilterListWidget extends StatelessWidget { /// Default is `Navigator.pop(context, null)` final void Function()? onCloseWidgetPress; + final Widget? header; + /// + final void Function()? onReset; + /// + final void Function(T, bool)? onSelected; + /// If true then it hide complete header section. final bool? hideHeader; @@ -137,7 +146,7 @@ class FilterListWidget extends StatelessWidget { final ValidateRemoveItem? validateRemoveItem; /// The `onItemSearch` is delegate which filter the list on the basis of search field text. - final SearchPredict onItemSearch; /*required*/ + final SearchPredict? onItemSearch; /// The `choiceChipLabel` is callback which required [String] value to display text on choice chip. final LabelDelegate choiceChipLabel; /*required*/ @@ -170,6 +179,33 @@ class FilterListWidget extends StatelessWidget { /// {@endtemplate} final List controlButtons; + Widget _buildHeader(BuildContext context) { + if (header != null) { + return header!; + } + if (hideHeader!) { + return const SizedBox(); + } + return Header( + headlineText: headlineText, + hideSearchField: hideSearchField, + hideCloseIcon: hideCloseIcon, + headerCloseIcon: headerCloseIcon, + onSearch: (String value) { + if (value.isEmpty) { + FilterState + .of(context) + .items = listData; + return; + } + if (onItemSearch != null) { + FilterState.of(context) + .filter((item) => onItemSearch!(item, value)); + } + }, + onCloseWidgetPress: onCloseWidgetPress, + ); + } Widget _body(BuildContext context) { final theme = FilterListTheme.of(context); return Container( @@ -178,24 +214,7 @@ class FilterListWidget extends StatelessWidget { children: [ Column( children: [ - if (hideHeader!) - const SizedBox() - else - Header( - headlineText: headlineText, - hideSearchField: hideSearchField, - hideCloseIcon: hideCloseIcon, - headerCloseIcon: headerCloseIcon, - onSearch: (String value) { - if (value.isEmpty) { - FilterState.of(context).items = listData; - return; - } - FilterState.of(context) - .filter((item) => onItemSearch(item, value)); - }, - onCloseWidgetPress: onCloseWidgetPress, - ), + _buildHeader(context), if (!hideSelectedTextCount) Padding( padding: const EdgeInsets.only(top: 5), @@ -213,6 +232,7 @@ class FilterListWidget extends StatelessWidget { enableOnlySingleSelection: enableOnlySingleSelection, validateSelectedItem: validateSelectedItem, validateRemoveItem: validateRemoveItem, + onSelected: onSelected, maximumSelectionLength: maximumSelectionLength, ), ), @@ -227,6 +247,7 @@ class FilterListWidget extends StatelessWidget { applyButtonText: applyButtonText, resetButtonText: resetButtonText, enableOnlySingleSelection: enableOnlySingleSelection, + onReset:onReset, onApplyButtonClick: () { final selectedItems = FilterState.of(context).selectedItems; if (onApplyButtonClick != null) { @@ -261,4 +282,5 @@ class FilterListWidget extends StatelessWidget { ), ); } + } diff --git a/lib/src/widget/choice_list.dart b/lib/src/widget/choice_list.dart index 4ce1cf1..febe68e 100644 --- a/lib/src/widget/choice_list.dart +++ b/lib/src/widget/choice_list.dart @@ -12,6 +12,7 @@ class ChoiceList extends StatelessWidget { this.choiceChipLabel, this.enableOnlySingleSelection = false, this.validateRemoveItem, + this.onSelected, this.maximumSelectionLength, }) : super(key: key); final ValidateSelectedItem validateSelectedItem; @@ -19,6 +20,8 @@ class ChoiceList extends StatelessWidget { final LabelDelegate? choiceChipLabel; final bool enableOnlySingleSelection; final ValidateRemoveItem? validateRemoveItem; + /// + final void Function(T, bool)? onSelected; final int? maximumSelectionLength; List _buildChoiceList(BuildContext context) { @@ -63,6 +66,9 @@ class ChoiceList extends StatelessWidget { state.addSelectedItem(item); } } + if (onSelected != null) { + onSelected!(item, !selected); + } }, selected: selected, text: choiceChipLabel!(item), diff --git a/lib/src/widget/control_button_bar.dart b/lib/src/widget/control_button_bar.dart index 576afcd..f19810d 100644 --- a/lib/src/widget/control_button_bar.dart +++ b/lib/src/widget/control_button_bar.dart @@ -1,7 +1,6 @@ import 'package:filter_list/filter_list.dart'; import 'package:filter_list/src/state/filter_state.dart'; import 'package:filter_list/src/state/provider.dart'; - import 'package:filter_list/src/widget/control_button.dart'; import 'package:flutter/material.dart'; @@ -17,6 +16,7 @@ class ControlButtonBar extends StatelessWidget { this.resetButtonText, this.applyButtonText, this.onApplyButtonClick, + this.onReset, this.maximumSelectionLength, required this.controlButtons, }) : super(key: key); @@ -27,6 +27,9 @@ class ControlButtonBar extends StatelessWidget { final VoidCallback? onApplyButtonClick; final int? maximumSelectionLength; + /// + final void Function()? onReset; + /// {@macro control_buttons} final List controlButtons; @@ -80,6 +83,9 @@ class ControlButtonBar extends StatelessWidget { rebuildOnChange: true, ); state.selectedItems = []; + if (onReset != null) { + onReset!(); + } }, ), SizedBox(width: theme.buttonSpacing),