Filtering is an optional feature. It allows to filter the preferences and render the result as a flat list or just filters and still keeps the hierarchy intact.
You just have to define a filter mode...
val filterModes = listOf(
DefaultPreferenceFilter.Mode.ContainsText,
DefaultPreferenceFilter.Mode.AllWords(false),
DefaultPreferenceFilter.Mode.AnyWord(false)
)... then create a filter setup ...
val filter = rememberDefaultPreferenceFilter(
highlightSpan = SpanStyle(color = Color.Red),
mode = filterModes[0]
)... and finally pass on the filter to the screen:
PreferenceScreen(
modifier = Modifier.weight(1f).fillMaxWidth(),
settings = settings,
filter = filter,
state = state
)Afterwards simple adjust the filter.search state in your TextField or wherever you want and the screen will automatically update the list of preferences based on your filter settings.
TextField(
value = filter.search.value,
onValueChange = { filter.search.value = it }
)Additionally the filter object does provide some states to make more adjustments if desired.
/**
* Remember a DefaultPreferenceFilter with the given parameters.
*
* @param search the search string to filter by
* @param flattenResult Whether to flatten the result of the filter
* @param mode the mode to use for the filter
* @param ignoreCase whether to ignore the case of the search string
* @param highlightSpan the SpanStyle to use for highlighting the search string
*/
class DefaultPreferenceFilter internal constructor(
override val search: MutableState<String>,
override val flattenResult: MutableState<Boolean>,
val mode: MutableState<Mode>,
private val ignoreCase: MutableState<Boolean>,
private val highlightSpan: SpanStyle
) : PreferenceFilterIf desired, you can implement a full custom implementation of the PreferenceFilter interface. Just check out the DefaultPreferenceFilter to find an example on how this is done.