#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
удаления из дерева представлений.
Узнайте больше о побочных эффектах в разделе «Мышление» в документации по составлению и побочным эффектам