Создавайте адаптивные приложения для 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.
На данный момент достаточно технической информации! Давайте рассмотрим это на примере.
В примере я постараюсь дать вам основную идею, не придавая особого значения дизайну, сценарию и чистоте кода.
Допустим, у нас есть магазин пончиков, и наши клиенты делают заказ через наше приложение.
Вот как работает наше приложение.
- Давайте представим, что мы перечисляем типы
doughnut
(Chocolate
,Strawberry
,Blueberry
и другие) на главной странице, и каждый из нашихdoughnut
имеет идентификатор. - Давайте запустим
DetailsScreen
при нажатии на выбранный пончик на главной странице и хотим показать пользователю информацию о выбранном пончике.. (isAvailable
,price
и т. д.) - У нас есть API для получения этой информации о пончике, и мы будем вызывать API в файле
DetailsScreen
. - На странице 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. А пока береги себя.