Создавайте адаптивные приложения для Android

Если вы готовы, я объяснюLaunchedEffect на примере. Однако, прежде чем мы поговорим о Launched Effect, давайте кратко поговорим о Side Effect.

Что такое побочный эффект?

В программировании; Побочный эффект — это когда функция изменяет переменную, значение или объект за пределами своей области.

Например, когда мы смотрим на функцию ниже, мы видим, что у нее нет побочного эффекта.

fun sum(number1: Int, number2: Int) = number1 + number2

Однако, если мы создадим функцию, как показано ниже, в конечном счете, каждый раз, когда вызывается функция sum, она будет изменять значение переменной result, что приведет к побочному эффекту.

var result = 0
fun sum(number1: Int, number2: Int) = result = number1 + number2

Или у него есть побочный эффект, так как он будет печатать результат суммы в виде журнала.

fun sum(number1: Int, number2: Int) = Log.e("Tag", (number1 + number2).toString())

Короче говоря, побочный эффект — это понятие, выражающее изменение другого состояния, переменной, объекта или значения во время операции.

Что такое LaunchedEffect в Jetpack Compose?

LaunchedEffect: запускать функции приостановки в рамках компонуемого

  • LaunchedEffect выполняется один раз при входе внутрь композиции. И отменяется при выходе из состава.
  • LaunchedEffect отменяет/перезапускает при изменении Keysсостояния
  • LaunchedEffect должен иметь хотя бы один key
  • LaunchedEffect Главный диспетчер Scope.

На данный момент достаточно технической информации! Давайте рассмотрим это на примере.

В примере я постараюсь дать вам основную идею, не придавая особого значения дизайну, сценарию и чистоте кода.

Допустим, у нас есть магазин пончиков, и наши клиенты делают заказ через наше приложение.

Вот как работает наше приложение.

  1. Давайте представим, что мы перечисляем типы doughnut(Chocolate, Strawberry, Blueberry и другие) на главной странице, и каждый из наших doughnut имеет идентификатор.
  2. Давайте запустим DetailsScreen при нажатии на выбранный пончик на главной странице и хотим показать пользователю информацию о выбранном пончике.. (isAvailable, price и т. д.)
  3. У нас есть API для получения этой информации о пончике, и мы будем вызывать API в файле DetailsScreen.
  4. На странице Details нам также нужно получить количество товара и т.д.

Давайте рассмотрим сценарий, в котором продукт уже выбран на главной странице и вызывается DetailsScreen, и у нас есть идентификатор продукта, и посмотрим, что происходит, когда мы не используем LaunchedEffect в первую очередь.

Экран сведений о пончике без LaunchedEffect

val coroutineScope -> — это область, в которой мы можем запускать функции приостановки. Мы сделаем вызов API в этой области.
val doughnutCount -›Переменная, в которой мы храним количество пончиков, которые закажет пользователь.
val details -› Переменная, в которой мы храним ответ API.

Давайте посмотрим на сообщения журнала, которые приходят, когда мы запускаем проект:

Compose был создан один раз при первом открытии DoughnutDetailsScreen.
Затем мы сделали вызов API, и когда пришел ответ, detailsпеременнаябыла сработало, и композиция была создана еще раз. Но подождите секунду. Что это такое!

Когда мы смотрим записи журнала, мы видим, что API был вызван снова…
Давайте также нажмем кнопку, чтобы увеличить количество пончиков. Каждый раз, когда я обновляю количество пончиков, выполняется вызов API.

Как видите, каждый раз, когда doughnutCount изменяется, compose перестраивается и API вызывается снова и снова. Я не думаю, что мы хотим такой ситуации.

Давайте внесем некоторые изменения в коды и посмотрим еще раз.

Я удалил coroutineScope. Нам это больше не нужно, потому что мы будем использовать LaunchedEffect, а LaunchedEffect уже предоставит нам область действия сопрограммы.

Экран сведений о пончике с LaunchedEffect

Я добавил LaunchedEffect и передал productId для запрошенного у меня параметра key1. Это означает: информирует LaunchedEffect о том, должна ли сопрограмма перезапускаться при изменении значения параметра key1.

Теперь давайте откроем Logcat и посмотрим, есть ли случай повторения вызова API, когда мы используем LaunchedEffect.

Compose был создан один раз при первом открытии DoughnutDetailsScreen.
Затем мы сделали вызов API, и когда пришел ответ, сработал details, и compose был создан еще раз. . Но, как вы заметили, вызов API больше не выполнялся.

И давайте продолжим и обновим количество пончиков.

Мы также обновили количество пончиков и, как видите, вызов API выполняется не в каждом обновлении.

Я объясню DisposableEffect в своем следующем посте на Medium. А пока береги себя.