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 forPablo
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 typePablo
12/14/2022, 12:13 PMPablo
12/14/2022, 12:23 PMPablo
12/14/2022, 12:23 PMmattinger
12/15/2022, 12:05 AM