Как управлять отчетами об ошибках как побочным эффектом в Jetpack Compose

#android #kotlin #android-jetpack-compose #side-effects

Вопрос:

Я играю с Jetpack Compose, и я думаю, что у меня есть побочный эффект в моем composable, который пытается отправить отчет об ошибке, когда находит неожиданное значение.

Например:

 @Composable
fun SampleComposable(state: State, text: String) {
    when (state) {
        value1 -> {
            // show composable
        }
        value2 -> {
            // show composable
        }
        else -> {
            // send an error report
        }
    }
    Text(text)
}
 

Поэтому я верю, что всякий раз, когда что state -то изменится или text изменится, это изменится. Если state это неожиданное значение и text оно изменится, оно отправит еще один отчет об ошибке. Поэтому я думаю, что в этом блоке есть побочный эффект else .

Есть ли способ структурировать этот код так, чтобы отчет об ошибке не отправлялся каждый раз?

Ответ №1:

В этом случае вы можете использовать LaunchedEffect :

 when (state) {
    value1 -> {
        // show composable
    }
    value2 -> {
        // show composable
    }
    else -> {
        LaunchedEffect(state) {
            // send an error report
        }
    }
}
 

LaunchedEffect лямбда будет выполняться только один раз при добавлении в дерево представления компоновки, включая удаление и повторное подключение в случае, если вы state принимаете допустимое значение, а затем возвращаетесь к недопустимому.

Кроме того, указав state в качестве ключа, вы можете повторно запустить его, если последовательно появятся два разных недопустимых состояния.

Обратите внимание, что эта лямбда-функция выполняется в области сопрограммы, поэтому вы можете вызывать suspend функции, но область будет отменена после LaunchedEffect удаления из дерева представлений.

Узнайте больше о побочных эффектах в разделе «Мышление» в документации по составлению и побочным эффектам