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

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

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

  • CRM keyCRM: зручне рішення для продажів, комунікацій і керування командою

    Успіх компанії залежить від того, наскільки швидко вона здатна опрацьовувати вхідні запити. Коли дані про клієнтів розпорошені між різними месенджерами, виникає хаос. CRM keyCRM пропонує вихід із цієї ситуації, об’єднуючи всі робочі процеси в єдиному зручному інтерфейсі.

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

    Crm
  • Різниця між UX і UI, яку варто зрозуміти ще до першого заняття

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

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

    Ui-ux
  • Логіка змін: як SEO оптимізація прибирає бар’єри до зростання

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

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

    Seo
  • Музичний футуризм: неймовірні інструменти XXI століття

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

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

    Музичні Інструменти
  • Стіл – всьому голова? Так, якщо його правильно підібрати

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

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

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

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

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

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

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

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

    Android

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

  • Світ став занадто складний… через Google. Отримання коду в смс.

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

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

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

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

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

    Samsung

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

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

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

  • Світ став занадто складний… через Google. Отримання коду в смс.

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

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

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

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

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

    Samsung