Side Effects
https://d.android.com/jetpack/compose/side-effects |
21.06.2023 | https://habr.com/ru/companies/joydev/articles/743048/ |
Cайд-эффекты используются для выполнения действий, которые не зависят от состояния 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(key1 = Unit) {
// Инициализация ресурса
println("Effect created")
// Код для очистки ресурса
onDispose {
println("Effect disposed")
}
}
// UI-компоненты и обработка состояния
Text("Check logs for DisposableEffect messages")
}
key
Параметр vararg
. Указывает на значение, изменение которого приведет к повторному запуску кода внутри DisposableEffect
и вызову onDispose
.
onDispose
Вызывается для выполнения кода очистки, когда эффект больше не нужен (например, когда компонент удаляется из дерева Compose или когда изменяется key
).
Вопросы на собесе (13)
SideEffect (1)
- Для чего используется SideEffect?
Используется для выполнения побочных эффектов, которые должны происходить после того, как
@Composable
функция завершит своё выполнение, и которые зависят от изменений состояния, но не должны вызывать повторный запуск самой функции.
- Для чего используется SideEffect?
LaunchedEffect (7)
- Для чего используется LaunchedEffect?
Используется для запуска корутин, которые зависят от изменений входных данных (
key
), и автоматически отменяет и перезапускает их при изменении этих данных.
- В каком потоке запускается LaunchedEffect?
На UI-потоке.
- В каких случаях LaunchedEffect перезапускается?
• При рекомпозиции.
• При изменении ключа.
- Сколько ключей может быть у LaunchedEffect?
Сколько угодно. Это
vararg
-параметр.
- Как выполнится LaunchedEffect если в качестве ключа передать Unit?
Эффект будет выполнен только один раз при первом компоновке компонента и не будет повторно запущен при изменении состояния. Это связано с тем, что
Unit
является неизменяемым значением, и при его использовании в качестве ключаLaunchedEffect
не будет отслеживать изменения.
- Разница между LaunchedEffect и SideEffect?
LaunchedEffect
запускает корутины при изменении входных параметров или первом составлении компонента, в то время какSideEffect
выполняет действия после обновления состояния UI.
- Разница между rememberCoroutineScope.launch и LaunchedEffect?
rememberCoroutineScope.launch
используется для запуска корутины в рамках текущего@Composable
, сохраняя ссылку на корутину при пересоздании, аLaunchedEffect
запускает корутину, когда меняются заданные зависимости, автоматически отменяя и перезапуская её при изменениях.
- Для чего используется LaunchedEffect?
DisposableEffect (4)
- Для чего используется DisposableEffect?
Используется для запуска кода при первом создании компонента и его очистки при отмене или изменении ключа (
key
), что удобно для управления ресурсами, которые нужно очистить, когда компонент удаляется или ключ изменяется.
- Когда вызывается метод onDispose у DisposableEffect?
При каждом обновлении
key
или при удалении компонента из композиции.
- Вызывается ли метод onDispose при изменении ключа?
Да.
- Какой из сайд-эффектов можно привязать к жизненному циклу Composable-функции?
DisposableEffect
- Для чего используется DisposableEffect?
Другие (1)
- Какие есть сайд-эффекты в Compose?
SideEffect
LaunchedEffect
DisposableEffect
- Какие есть сайд-эффекты в Compose?