Как обрабатывать запросы на увольнение из диалога, запущенного из Composable, переданного как переменная

Я хочу создать составной элемент для обработки общих настроек, которые отображают диалог (например, чтобы заменить EditTextPreference и ListPreference API предпочтений Androidx). Идея состоит в том, что это GenericSettingWithDialog принимает на вход Composable, обрабатывающий содержимое диалога:

@Composable
fun GenericSettingWithDialog (
    name: String,
    state: State<String>,
    dialogContent: @Composable ()-> Unit
) {
    var isDialogShown by remember {
        mutableStateOf(false)
    }
    if (isDialogShown) {
        Dialog(onDismissRequest = {
            isDialogShown = false
        }) {
            dialogContent()
        }
    }
    // setting row launching the dialog, with title and graphics
}

К сожалению, эта реализация не может обрабатывать запросы на закрытие диалога, поступающие из самого диалога, например, при нажатии кнопки «Подтвердить».

Я работаю над возможностью использования функциональных литералов Kotlin с получателем, как показано в этом ответе: Функция Jetpack Compose с лямбда() -> Unit, но пока непонятно как.

Вместо этого я использую AlertDialog, в котором есть встроенные обработчики DisclaimButton и ConfirmButton.

user3791775 24.06.2024 18:46

@user3791775 user3791775, к сожалению, нет, мне нужен диалог, потому что мне нужно настроить его внешний вид и поведение.

perissf 24.06.2024 23:39

@perissf используйте AlertDialog и настройте его с помощью stackoverflow.com/questions/22655599/…

Bob 25.06.2024 00:04

@BobSmith, к сожалению, нет, вопрос связан с Android Compose, а не с представлениями

perissf 25.06.2024 11:08
1
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите закрыть диалог по событию DialogContent, мы можем передать лямбда-функцию в dialogContent: @Composable ()-> Unit, как показано ниже.

Обновлен код GenericSettingWithDialog.

@Composable
fun GenericSettingWithDialog (
    name: String,
    state: State<String>,
    dialogContent: @Composable ( onDismiss: (() -> Unit)? )-> Unit
) {
    var isDialogShown by remember {
        mutableStateOf(true)
    }
    if (isDialogShown) {
        Dialog(onDismissRequest = {
            isDialogShown = false
        }) {
            dialogContent(){
                isDialogShown = false
            }
        }
    }
    // setting row launching the dialog, with title and graphics
}

При использовании вышеуказанной функции следуйте инструкциям ниже.

GenericSettingWithDialog("abc",str){onDismiss->
        Box(modifier = Modifier
            .size(250.dp)
            .background(Grey1)){
            Box (modifier = Modifier
                .size(50.dp)
                .background(Color.Red)
                .clickable {
                    onDismiss?.invoke()
                }){

            }
        }
    }

Здесь onDismiss вызывается, когда вы хотите закрыть диалог из диалогаContent.

Ваше здоровье!!

Другие вопросы по теме

Как исправить проблему с KMP. Инициализируйте хотя бы одну цель Kotlin в «composeApp (:composeApp)» или «shared»?
Плагин [id: 'kotlin-android', версия: '1.7.10'] не был найден ни в одном из следующих источников в Android Studio для Flutter
Текст с обводкой или границами в наборе реактивного ранца
Ошибка Kotlin: java.lang.RuntimeException: не удалось найти реализацию для com.example.tutorialfollowing.AppDatabase. AppDatabase_Impl не существует
Ошибка размера анимированной бутылки с водой при составлении реактивного ранца
Рукоять кинжала: «Невозможно создать экземпляр ViewModel» при использовании внедрения зависимостей
Невозможно получить доступ к классу Retrofit2.Response. Проверьте путь к классам вашего модуля на предмет отсутствующих или конфликтующих зависимостей
Как я могу проверить, реализует ли класс интерфейс в Котлине?
Как передать строковый параметр в модель представления в составлении?
Как создать построитель шагов в Kotlin, который поддерживает повторяемые шаги

Похожие вопросы

Ссылка на приложение Android не ведет в Play Store, когда приложение не установлено, но работает правильно, когда приложение установлено
Почему полученные сообщения не отображаются в пользовательском интерфейсе?
Текст с обводкой или границами в наборе реактивного ранца
Ошибка Kotlin: java.lang.RuntimeException: не удалось найти реализацию для com.example.tutorialfollowing.AppDatabase. AppDatabase_Impl не существует
Не могу запустить эмулятор Android Win11 Home
Потрясающие уведомления — различные диалоговые окна для запроса разрешения у пользователя на Android
Hilt 2.44.2 — класс не найден при использовании @AndroidEntryPoint в GlanceAppWidgetReceiver
Ошибка размера анимированной бутылки с водой при составлении реактивного ранца
Свойство цвета строки состояния Android не применяется к действиям, выполненным из предустановки действий «Пустые представления»
Предварительный просмотр Jetpack для экрана с параметрами SharedTransitionScope, AnimatedVisibilityScope