Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

03.12.2023

Дев-адвент 3: віджет


Ось так (з правого боку) це виглядає на заблокованому екрані.

Iнтервальне голодування - перевірений спосіб контролю ваги. Якщо одним реченням, то “їсти дозволено тільки протягом вікна у 8 годин на добу.” Давно хотів впровадити віджет для iOS, який показував би поточний інтервал. Що і зробив сьогодні.

Вже писав, як взагалі працюють віджети. Але у SwiftUI я ще віджетів не робив — тільки через React Native. Ну, точніше, сам віджет був все одно на SwiftUI. Але дані для віджета я будував в головній програмі на JavaScript (бо база та все інше було там), та передавав через UserDefaults - що взагалі було гаком, бо UserDefaults призначений для налаштувань.

Коли вся програма на Swift, то так робити немає потреби. Віджет робиться зі спільного коду програми, та не має технічних обмежень на те, що дозволено робити для підготовки даних. Взагалі, чому я кажу “підготувати дані для віджета”? Тому що віджет на iOS складається з часової послідовності простих обʼєктів-конфігурацій та компоненти на SwiftUI, який робить з поточної конфігурації статичний вид.

Важливий момент 1: ми маємо заздалегідь запланувати, в який час та який вигляд буде приймати віджет. Немає такого, що можна сходити в базу чи в інтернет та оновити дані — таке оновлення відбувається рідко та за рішенням ОС (та повністю заміняє всю послідовність). В моєму випадку, це влаштовує, бо віджет показуватиме стан сталого розкладу.

Важливий момент 2: для кожної нової конфігурації віджет малюється тільки один раз, буквально. Після цього ОС бере з нього “знімок”, який вже не зміниться. Як мінімум це значить, що всі дані мають бути підготовані заздалегідь — ніякого “стану завантаження” нам не дано, як і ніяких ефектів після промальовки. В мене була модель, яка обчислювала свій стан в асинхронному блоці. Ось її довелось переробити на синхронне обчислення.

З приємного: архітектура віджетів однакова для iOS, watchOS, та macOS, а також для всіх різновидів віджетів, таких як віджети екрана блокування. Тому і навички, і код дійсно кросплатформні.