Друкарня від 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 не буде виконано, скільки б разів не тиснули на кнопку.

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

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

  • Шлейф сучасного смартфону та його призначення

    Шлейф - це тонка пластикова стрічка з ледь видимими доріжками і саме вона зʼєднує важливі компоненти мобільного, без яких він не запрацює. Власники пристроїв Xiaomi, які стикаються з потребою заміни цієї деталі, можуть підібрати відповідний варіант на сайті AKS.UA

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

    Шлейф Для Мобільного
  • Чохли для iPhone 15: повний гід по кольорах, матеріалах і виробниках

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

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

    Чохли Для Iphone
  • Як побудована програма Meest China Academy

    Курс про товарний бізнес охоплює різні етапи роботи: від пошуку ідеї до перевірки товару, логістики та масштабування. Програма Meest China Academy містить 17 модулів, які послідовно розкривають ці теми без зведення всього навчання до однієї універсальної поради.

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

    Meest
  • Які технології використані в Айфон 17

    Айфон 17 поєднує OLED-дисплей із частотою до 120 Гц, чип A19, дві камери Fusion 48 Мп і швидке заряджання через USB-C. У COMFY можна купити Айфон 17 з накопичувачем на 256 або 512 ГБ, вибравши конфігурацію відповідно до обсягу фото, відео та застосунків

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

    Iphone 17
  • Як вибрати вживаний iPhone: коротке керівництво для розумної покупки

    Вторинний ринок смартфонів Apple активно зростає, і питання, як вибрати вживаний iPhone, стає актуальним для дедалі більшої кількості користувачів. Правильний підхід дозволяє отримати бу iPhone з актуальною iOS і доброю камерою за помітно нижчу ціну, ніж у нових пристроїв.

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

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

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

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

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

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

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

    Android

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

  • Огляд/досвід використання Samsung Galaxy S24 Ultra

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

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

    Samsung
  • Створення логотипа Perplexity з матового скла у Jetpack Compose

    У цьому туторіалі ми створимо анімований логотип Perplexity, що має ефект матового скла. Ми використаємо бібліотеку haze від Chris Banes для імітації скла та graphicsLayer для 3D-анімації

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

    Android

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

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

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

  • Огляд/досвід використання Samsung Galaxy S24 Ultra

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

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

    Samsung
  • Створення логотипа Perplexity з матового скла у Jetpack Compose

    У цьому туторіалі ми створимо анімований логотип Perplexity, що має ефект матового скла. Ми використаємо бібліотеку haze від Chris Banes для імітації скла та graphicsLayer для 3D-анімації

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

    Android