Dialog Number
This shows a number picker dialog. You can always use the InputDialog
for numbers as well and change its options to accept numbers only and even attach a validator. But this one is meant for picking numbers with the help of one or two increase and decrease buttons.
Check out the composable and it's documentation in the code snipplet below.
Generally following can be adjusted:
- min/max/step values
- custom formatter
Composable#
/**
* Shows a dialog with a number picker
*
*
*
* **Basic Parameters:** all params not described here are derived from [Dialog], check it out for more details
*
* @param value the number state for this dialog
* @param setup the [NumberPickerSetup]
* @param iconDown the icon for the decrease button
* @param iconUp the icon for the increase button
* @param formatter the formatter for the text of this picker
* @param textStyle the [TextStyle] for the text of this picker
* @param onValueStateChanged a callback that will be called whenever the value of the number picker changes
*/
@Composable
fun <T : Number> DialogNumberPicker(
// Base Dialog - State
state: DialogState,
// Custom - Required
value: MutableState<T>,
setup: NumberPickerSetup<T>,
iconDown: @Composable () -> Unit = {
Icon(imageVector = Icons.AutoMirrored.Filled.KeyboardArrowLeft, contentDescription = null)
},
iconUp: @Composable () -> Unit = {
Icon(imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, contentDescription = null)
},
iconDown2: @Composable () -> Unit = {
Icon(imageVector = Icons.Default.KeyboardDoubleArrowLeft, contentDescription = null)
},
iconUp2: @Composable () -> Unit = {
Icon(imageVector = Icons.Default.KeyboardDoubleArrowRight, contentDescription = null)
},
formatter: (value: T) -> String = { it.toString() },
// Custom - Optional
textStyle: TextStyle = MaterialTheme.typography.bodyMedium,
onValueStateChanged: (value: T) -> Unit = { },
// Base Dialog - Optional
title: (@Composable () -> Unit)? = null,
icon: (@Composable () -> Unit)? = null,
style: ComposeDialogStyle = DialogDefaults.defaultDialogStyle(),
buttons: DialogButtons = DialogDefaults.buttons(),
options: Options = Options(),
onEvent: (event: DialogEvent) -> Unit = {}
)
Example#
// would work with Int, Long, Double and Float (all options of Number!)
val number = 5
val state = rememberDialogState()
if (state.visible) {
// special state for input dialog
val value = rememberDialogNumber(number)
// number dialog
DialogNumberPicker(
state = state,
title = { Text("Integer Picker Dialog") },
value = value,
icon = icon,
style = style,
onEvent = {
if (it is DialogEvent.Button && it.button == DialogButtonType.Positive) {
// we should probably handle the input value in this case
context.showToast("Submitted Input: ${value.value}")
} else {
context.showToast("Event $it")
}
},
setup = NumberPickerSetup(
min = 0, max = 100, stepSize = 5
)
)
}