October 19

2. Side Effects and Effect Handlers в Jetpack Compose

Обработчики сайд-эффектов - важный механизм в Jetpack Compose. Без них разработчику пришлось бы управлять сложной иерархией коллбеков, состоянием, навигацией и тд. Effect Handler'ы упрощают эти задачи.

Что такое сайд эффект в Jetpack Compose?

В терминологии Jetpack Compose - это нечто изменяющее состояние извне функции. Это может привести к непредсказуемому поведению этой функции, а также проблемам с производительностью приложения. В идеале разработчики хотели бы избегать таких вот эффектов в своем коде. Но избежать их полностью не выйдет. Порой все же разработчики сталкиваются с такого рода задачами. Например: показ всплывающего окна или навигация на другой экран. Такое поведение - это в любом случае сайд-эффекты!

Jetpack Compose работает на основе рекомпозиций. Чтобы управлять этими механизмами Compose предоставляет специальные тулзы, которые помогают решать задачи в рамках ЖЦ компонентов.

Типы сайд эффектов

  • LaunchedEffect
  • rememberCoroutineScope()
  • ProduceState
  • rememberUpdateState()
  • DisposableEffect
  • SideEffect
  • DerivedStateOf
  • SnapshotFlow

  1. LaunchedEffect - в Jetpack Compose служит для выполнения IO операций или тяжелых вычислений. В момент когда Compose заходит в композицию, запускается код прописанный в блоке, обернутый в корутину. Также LaunchedEffect получает на вход ключ. Это может быть Unit или другой тип данных. От этого зависит частота его вызова. Код в блоке триггерится в момент, когда значение ключа меняется. Либо же выполняется единоразово если ключ - Unit

2. rememberCoroutineScope - создает и управляет скоупом корутины. Скоуп привязан к ЖЦ Composable функции. Этот механизм упрощает управление корутинами и снижает риск утечек памяти

3. ProduceState - функция позволяющая создавать State объект обернутый в корутину. Это означает что объект состояния будет обновляться в пределах корутины и его изменения будут отражены на Composable функции использующей его. Producer начинает работать когда produceState заходит в композицию и останавливается когда выходит из нее. Установка одного и того же значения в produceState не вызовет рекомпозицию повторно.

4. rememberUpdateState - простыми словами это функция в Jetpack Compose используется для запоминания значения которое может быть обновлено во время композиции Composable. Эта функция полезна для хранения результатов тяжелых и длительных операций, которые вы не хотите пересчитывать заново.

5. DisposableEffect - это механизм предоставляемый Jetpack Compose для отслеживания ЖЦ Composable и последующей очистки занятых им ресурсов. Очистка ресурсов происходит в тот момент, когда Composable функция удаляется с экрана. По сути работы аналогичен LaunchedEffect, но дополнительно предоставляет функцию onDispose для очистки ресурсов.

6. SideEffect - это эффект позволяющий Jetpack Compose менять состояние приложения которые находятся вне скоупа Composable функции. Для примера вы можете использовать SideEffect для обновления Data Store или выполнения HTTP запроса основанного на состоянии.

7. DerivedStateOf - полезен когда есть задача вычислить новый стейт на основании предыдущих состояний, снизив тем самым количество ненужных вычислений.

Например: у нас может быть поле ввода пароля, чье значение представлено состояние и состояние принимающее этот пароль и высчитывающее его сложность.

8. snapshotFlow - конвертирует State объект во Flow. Это Flow будет эмитить текущее значение объекта State, каждый раз при его изменении.