Pablo
12/13/2022, 7:30 AMmattinger
12/14/2022, 3:12 AMmattinger
12/14/2022, 3:34 AMdata class DialogButtonParameters(
val text: String,
val onClick: () -> Unit,
)
data class DialogParameters(
val title: String,
val confirmButton: DialogButtonParameters?,
val dismissButton: DialogButtonParameters?,
)
class DialogHostState {
internal var currentParameters by mutableStateOf<DialogParameters?>(null)
fun showDialog(parameters: DialogParameters) {
currentParameters = parameters
}
fun hideDialog() {
currentParameters = null
}
}
@Composable
fun rememberDialogHostState() =
remember {
DialogHostState()
}
@Composable
fun DialogScaffold(
state: DialogHostState = rememberDialogHostState(),
content: @Composable (DialogHostState) -> Unit,
) {
state.currentParameters?.let { params ->
AlertDialog(
onDismissRequest = { state.hideDialog() },
title = {
Text(text = params.title)
},
confirmButton = {
params.confirmButton?.let { button ->
TextButton(onClick = { button.onClick() }) {
Text(text = button.text)
}
}
},
dismissButton = {
params.dismissButton?.let { button ->
TextButton(onClick = { button.onClick() }) {
Text(text = button.text)
}
}
},
)
}
content(state)
}
@Composable
@Preview
fun DialogScaffoldPreview() {
val state = rememberDialogHostState()
DialogScaffold(state = state) {
Box(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Button(
onClick = {
state.showDialog(
DialogParameters(
title = "Hello There",
confirmButton = DialogButtonParameters("OK") {
state.hideDialog()
},
dismissButton = null
)
)
}
) {
Text(text = "Show Dialog")
}
}
}
}
Pablo
12/14/2022, 11:52 AMPablo
12/14/2022, 11:52 AMPablo
12/14/2022, 11:52 AMype 'MutableState<DialogParameters?>' has no method 'getValue(DialogHostState, KProperty<*>)' and thus it cannot serve as a delegate
Type 'MutableState<DialogParameters?>' has no method 'setValue(DialogHostState, KProperty<*>, [Error type: Error delegation type for
Pablo
12/14/2022, 11:53 AMvalue-parameter params: [Error type: Cannot infer a lambda parameter type]
Pablo
12/14/2022, 11:53 AMvalue-parameter button: [Error type: Cannot infer a lambda parameter type
Pablo
12/14/2022, 12:13 PMPablo
12/14/2022, 12:23 PMPablo
12/14/2022, 12:23 PMmattinger
12/15/2022, 12:05 AM