Зачем нужны сайд-эффекты (LaunchedEffect, DisposableEffect) и как их использовать? LaunchedEffect и DisposableEffect — основные API Jetpack Compose для управления сайд-эффектами.
Зачем нужны сайд-эффекты LaunchedEffect и DisposableEffect и как их использовать?
Зачем нужны сайд-эффекты (LaunchedEffect, DisposableEffect) и как их использовать? LaunchedEffect и DisposableEffect — основные API Jetpack Compose для управления сайд-эффектами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Зачем нужны сайд-эффекты (LaunchedEffect, DisposableEffect) и как их использовать?
LaunchedEffect и DisposableEffect — основные API Jetpack Compose для управления сайд-эффектами.
- LaunchedEffect: запускает корутину при создании ключа и автоматически отменяет её, если ключ изменился или композиция была уничтожена
- применяется для запуска асинхронных операций, например загрузки данных или навигации
пример: получение данных при открытии экрана (fetchData внутри LaunchedEffect(key))
DisposableEffect: выполняется в соответствии с жизненным циклом композиции и позволяет организовать очистку и освобождение ресурсов
- получает callback очистки, который вызывается при выходе из композиции либо при изменении ключа
пример: добавление и удаление слушателей, освобождение ресурсов, например отмена подписки
оба API связывают жизненный цикл эффектов с композицией, помогая избежать утечек и лишних вызовов
Итог: сайд-эффекты нужны для безопасного взаимодействия с внешним миром — асинхронными процессами и ресурсами — в декларативном UI на Compose.
Подробный ответ
Основной ответ
В Jetpack Compose сайд-эффекты, включая LaunchedEffect и DisposableEffect, применяются для управления действиями, выходящими за пределы обычного рендеринга UI и требующими выполнения кода с побочными эффектами. К таким действиям относятся запуск корутин, подписка на события и освобождение ресурсов. Эти API позволяют связывать Compose с асинхронными и внешними операциями, корректно учитывая состояние и recomposition.
LaunchedEffect запускает заданную корутину при первом вызове, а затем автоматически отменяет её при уничтожении composable или изменении ключа, что помогает предотвращать утечки.
DisposableEffect предназначен для выполнения действий при создании composable и очистки ресурсов при его удалении — например, для отписки от слушателей или остановки таймеров.
Ключевые моменты
- LaunchedEffect подходит для асинхронных задач, которые нужно запустить при монтировании UI, например для загрузки данных или запуска анимации. Ключи определяют, потребуется ли повторный запуск после изменения параметров.
- DisposableEffect используется, когда ресурс необходимо выделить при появлении composable и освободить при его исчезновении, например выполнить register/unregister BroadcastReceiver или listeners.
- Оба API выполняются в контексте композиции и автоматически учитывают recomposition, благодаря чему предотвращаются дублирование действий и утечки.
Практический контекст
Например, в приложении с авторизацией, внутри LoginScreen:
- LaunchedEffect(Unit) запускает проверку сессии или обращение к API при появлении экрана.
- DisposableEffect после ухода со страницы может удалить подписку на push-уведомления или остановить таймер загрузки.
Это удобный и понятный способ управлять побочными эффектами в декларативном UI, сохраняя код чистым и упрощая его сопровождение.