Друкарня від WE.UA

Як запобігти багаторазовим натисканням в Android Jetpack Compose і до чого тут Lifecycle

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

Раніше, повторне натискання просто клало застосунок, так як процес уже запустився, і ще раз навігуватись із поточного екрану було не можливо.

Зараз саме цю проблему пофіксили, і апка не вилітає, проте екран створюється кілька разів (по кількості натискань) і потрапляє в стек навігації, що теж не є добре.

Звісно, розробники вигадали купу різних способів, щоб це обійти. І затримка часу, коли на деякий час після натискання кнопка блокується. Блокування кнопки після натискання, обертання навігації в LaunchEffect, перевірка currentDestination та інші цікаві способи.

Це все працювало, але це все "милиці", якими підпирали проблему.

І ось, не знаю коли саме знайшлось це рішення, але воно є:

Це функція dropUnlessResumed()

Button(
    onClick =
        dropUnlessResumed {
            // Run on clicks only when the lifecycle is at least RESUMED.
            // Example: navController.navigate("next_screen")
        },
) {
    Text(text = "Navigate to next screen")
}

Ось так вона виглядає:

@Composable
fun dropUnlessResumed(
    lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
    block: () -> Unit
): () -> Unit

Цей функція блокує виконання коду, що в ній розміщено, якщо

lifecycleState != State.RESUMED

От ми і підійшли до моменту, коли потрібно розкрити роль Lifesycle у всьому цьому.

Деякі розробники сумніваються в правильності підходу використання функції dropUnlessResumed(), хоча саме такий спосіб її використання вказаний у документації. Аргументують це тим, що стан життєвого циклу можуть змінити і інші чинники.

То ж, давайте трохи розберемось із цим станом

Екрани написані з допомогою compose мають свій життєвий цикл:

  • CREATED

  • STARTED

  • RESUMED

  • DESTROYED

Доступний для користування екран, має стан RESUMED. В момент натискання кнопки і виклику навігації, система генерує подію, яка приводить до зміни стану за таким принципом:

ON_CREATE, ON_STOP -> return State.CREATED
ON_START, ON_PAUSE -> return State.STARTED
ON_RESUME -> return State.RESUMED
ON_DESTROY -> return State.DESTROYED
ON_ANY -> {}

В нашому випадку це ON_PAUSE і STARTED, відповідно.

Оскільки STARTED не RESUMED - блок коду, що запускає навігацію, який ми помістили у фігурні дужки методу dropUnlessResumed не буде виконано, скільки б разів не тиснули на кнопку.

Тепер щодо зміни стану з інших причин. Функція блокує, а не запускає виконання коду. То ж, якщо стан життєвого циклу зміниться через інші події, дія кнопки буде заблокована. Але ж нам це і потрібно, чи не так?

Статті про вітчизняний бізнес та цікавих людей:

  • Як модні бренди формують культуру та впливають на глобальні fashion-тренди

    Модні бренди часто стають символами ідентичності. Вони впливають на вибір способу життя не тільки в одязі — розкішні годинники, парфуми, товари для дому та враження підкріплюють культурні наративи успіху, смаку та вишуканості.

    Теми цього довгочиту:

    Мода
  • Створити блог на Друкарні - швидко, легко та безкоштовно

    Друкарня - це зручне та безкоштовне середовище для ведення власного блогу. В даній статті ми розповідаємо про основні переваги та функціональні можливості для того, щоб зацікавити нових авторів створити власний блог на Друкарні. Будь ласка, поширте цю інформацію.

    Теми цього довгочиту:

    Друкарня
  • Чому Google Merchant Center може заблокувати обліковий запис?

    Одним з найбільш ефективних каналів продажів є система Google Merchant Center. Правда, акаунт в ній може бути несподівано заблокований, якщо при його налаштуванні були порушені правила системи. У статті розглянемо підводні камені і дамо відповідь як уникнути блокування

    Теми цього довгочиту:

    Google Merchant Center
  • Бухгалтерський супровід ФОП: сучасний підхід до обліку

    Завдяки розвитку інформаційних технологій, впровадженню сучасних рішень і сервісів процес ведення бухобліку бізнесу став значно простішим і зручним. З іншого боку, ті ж технології додали бухгалтерам роботи – з обліком онлайн-продажів і надходжень у валюті, CRM-системами та ін.

    Теми цього довгочиту:

    Бухгалтерський Облік Фоп
  • Пилосос як базова техніка для щоденного прибирання

    Підтримання чистоти в оселі потребує зручних і продуманих рішень, особливо коли йдеться про догляд за різними поверхнями. У домашньому побуті пилосос залишається базовою побутовою технікою, що поєднує сухе та вологе очищення без зайвих зусиль.

    Теми цього довгочиту:

    Пилососи
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Євгеній Маслак
Євгеній Маслак@maslak we.ua/maslak

2Довгочити
24Прочитання
1Підписники
На Друкарні з 15 серпня

Більше від автора

  • Нова навігація в Jetpack compose на android

    Від 4 вересня 2024 року, коли вийшло оновлення 2.8.0, робити навігацію з передачею параметрів між екранами в jetpack compose стало набагато простіше. А також зручніше і зрозуміліше

    Теми цього довгочиту:

    Android

Це також може зацікавити:

  • Хто такий Android-розробник? Повний путівник

    В сучасному світі, де мобільні пристрої відіграють все більшу роль, професія Android-розробника стає все більш затребуваною. Ці спеціалісти створюють мобільні додатки для смартфонів, планшетів та інших пристроїв, які працюють на операційній системі Android.

    Теми цього довгочиту:

    Android

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити:

  • Хто такий Android-розробник? Повний путівник

    В сучасному світі, де мобільні пристрої відіграють все більшу роль, професія Android-розробника стає все більш затребуваною. Ці спеціалісти створюють мобільні додатки для смартфонів, планшетів та інших пристроїв, які працюють на операційній системі Android.

    Теми цього довгочиту:

    Android