Side Effects
https://d.android.com/jetpack/compose/side-effects |
21.06.2023 | https://habr.com/ru/companies/joydev/articles/743048/ |
Cайд-эффекты (side effects) используются для выполнения действий, которые не зависят от состояния UI и должны быть выполнены при изменении состояния или при создании компонента. Они позволяют управлять эффектами, которые не могут быть непосредственно выражены через декларативное описание UI.
SideEffect
Используется для выполнения побочных эффектов, которые должны быть выполнены при каждом запуске композируемой функции. Это средство позволяет выполнять действия, которые не влияют непосредственно на отображение UI, но могут быть важны для управления состоянием или взаимодействия с внешними системами.
• Выполняет код, который зависит от состояния и должен быть выполнен каждый раз, когда композируемая функция запускается или пересоздается.
// SideEffect используется для вывода сообщения в консоль каждый раз, когда изменяется состояние state.
@Composable
fun ExampleComponent() {
val state = remember { mutableStateOf(0) }
// Эта функция будет вызвана при каждом изменении `state`
SideEffect {
println("State has changed: ${state.value}")
}
// UI-компоненты и обработка состояния
Button(onClick = { state.value += 1 }) {
Text("Increment State")
}
}
LaunchedEffect
Используется для выполнения асинхронных операций или запуска кода в рамках жизненного цикла композируемой функции. Он позволяет запускать код, который должен быть выполнен один раз или когда определенные параметры изменяются.
• Для выполнения асинхронных операций, таких как запуск корутин, и других действий, которые могут потребовать выполнения при изменении состояния.
• LaunchedEffect автоматически отменяет запущенные корутины, когда композируемая функция выходит из композиции, что позволяет избегать утечек памяти.
// LaunchedEffect используется для запуска корутины, которая будет выполняться при изменении значения состояния state.value.
@Composable
fun ExampleComponent() {
val state = remember { mutableStateOf(0) }
// Эта корутина будет запущена при первом запуске и при изменении `state.value`
LaunchedEffect(key1 = state.value) {
// Выполнение асинхронной операции
delay(1000) // Задержка в 1 секунду
println("State has changed to: ${state.value}")
}
// UI-компоненты и обработка состояния
Button(onClick = { state.value += 1 }) {
Text("Increment State")
}
}
key
Параметр vararg. Указывает на значение, изменение которого приведет к повторному запуску кода внутри LaunchedEffect.
DisposableEffect
Используется для управления ресурсами и выполнения кода при создании и очистке эффекта. Он позволяет регистрировать и отменять побочные эффекты, связанные с жизненным циклом компонента. Когда DisposableEffect создается, он выполняет заданный код (например, регистрацию слушателей или инициализацию ресурсов). При отмене или удалении компонента, функция, возвращаемая DisposableEffect, вызывается для очистки ресурсов. Полезен для управления ресурсами, требующими явной очистки, таких как регистрация слушателей, открытие файлов или работа с системными ресурсами.
@Composable
fun ExampleComponent() {
DisposableEffect(Unit) {
// Инициализация ресурса
println("Effect created")
// Код для очистки ресурса
onDispose {
println("Effect disposed")
}
}
// UI-компоненты и обработка состояния
Text("Check logs for DisposableEffect messages")
}
onDispose
Вызывается для выполнения кода очистки, когда эффект больше не нужен (например, когда компонент удаляется из дерева Compose).
Compose Side Effects. Вопросы на собесе
- Какие бывают сайд-эффекты?
SideEffect
LaunchedEffect
DisposableEffect
- Для чего используется SideEffect?
Используется для выполнения побочных эффектов, которые должны происходить после того, как
@Composable
функция завершит своё выполнение, и которые зависят от изменений состояния, но не должны вызывать повторный запуск самой функции.
- Для чего используется LaunchedEffect?
Используется для запуска корутин, которые зависят от изменений входных данных (
key
), и автоматически отменяет и перезапускает их при изменении этих данных.
- Для чего используется DisposableEffect?
Используется для запуска кода при первом создании компонента и его очистки при отмене или изменении ключа (
key
), что удобно для управления ресурсами, которые нужно очистить, когда компонент удаляется или ключ изменяется.
- В чем разница между rememberCoroutineScope.launch и LaunchedEffect?
rememberCoroutineScope.launch
используется для запуска корутины в рамках текущего@Composable
, сохраняя ссылку на корутину при пересоздании, аLaunchedEffect
запускает корутину, когда меняются заданные зависимости, автоматически отменяя и перезапуская её при изменениях.