Skip to content

NumberPicker

NumberPicker is a basic interactive component in Miuix used for selecting a value from a range of numbers by vertical scrolling. The selected item is centered and highlighted, while surrounding items fade out and scale down. Supports infinite scrolling with the wrapAround parameter.

Import

kotlin
import top.yukonga.miuix.kmp.basic.NumberPicker

Basic Usage

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..10
)

Component States

Disabled State

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..10,
    enabled = false
)

Infinite Scrolling

When wrapAround is enabled, the picker wraps from the last item back to the first, allowing continuous scrolling.

kotlin
var value by remember { mutableIntStateOf(0) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..23,
    wrapAround = true
)

Properties

NumberPicker Properties

Property NameTypeDescriptionDefault ValueRequired
valueIntCurrent selected value. If outside range, it will be coerced-Yes
onValueChange(Int) -> UnitCallback invoked when the selected value changes-Yes
modifierModifierModifier applied to the pickerModifierNo
enabledBooleanWhether the picker is enabled for user interactiontrueNo
rangeIntRangeThe range of selectable values0..10No
label(Int) -> StringConverts a value to its display stringNo
visibleItemCountIntNumber of visible items. Must be odd and at least 35No
wrapAroundBooleanWhether the picker wraps around (infinite scrolling)falseNo
colorsNumberPickerColorsColor configuration of the pickerNumberPickerDefaults.colors()No
textStyleTextStyleText style for picker itemsMiuixTheme.textStyles.title1No
itemHeightDpThe height of each item in the pickerNumberPickerDefaults.ItemHeightNo

NumberPickerDefaults Object

The NumberPickerDefaults object provides default configurations for the NumberPicker component.

Properties

Property NameTypeDescriptionDefault Value
ItemHeightDpDefault height of each item45.dp

Methods

Method NameReturn TypeDescription
colors()NumberPickerColorsCreates default color configuration

NumberPickerColors Class

Property NameTypeDescription
selectedTextColorColorText color for the selected (center) item
unselectedTextColorColorText color for unselected items
disabledSelectedTextColorColorSelected text color when disabled
disabledUnselectedTextColorColorUnselected text color when disabled

Advanced Usage

Custom Label Format

kotlin
var hour by remember { mutableIntStateOf(9) }

NumberPicker(
    value = hour,
    onValueChange = { hour = it },
    range = 0..23,
    label = { it.toString().padStart(2, '0') }  // "00", "01", ... "23"
)

Time Picker

Combine two NumberPickers to create a time picker.

kotlin
var hour by remember { mutableIntStateOf(16) }
var minute by remember { mutableIntStateOf(30) }

Row(
    horizontalArrangement = Arrangement.Center,
    verticalAlignment = Alignment.CenterVertically,
) {
    NumberPicker(
        value = hour,
        onValueChange = { hour = it },
        range = 0..23,
        label = { it.toString().padStart(2, '0') },
        wrapAround = true,
        modifier = Modifier.weight(1f),
    )
    Text(
        text = ":",
        fontWeight = FontWeight.Bold,
    )
    NumberPicker(
        value = minute,
        onValueChange = { minute = it },
        range = 0..59,
        label = { it.toString().padStart(2, '0') },
        wrapAround = true,
        modifier = Modifier.weight(1f),
    )
}

Custom Visible Item Count

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 1..100,
    visibleItemCount = 3
)

Custom Colors

kotlin
var value by remember { mutableIntStateOf(5) }

NumberPicker(
    value = value,
    onValueChange = { value = it },
    range = 0..10,
    colors = NumberPickerDefaults.colors(
        selectedTextColor = Color.Red,
        unselectedTextColor = Color.Gray
    )
)

Changelog

Released under the Apache-2.0 License