tgoop.com »
United States »
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck » Telegram Web
В SwiftUI alert — это способ показать критически важную информацию или запросить решение у пользователя.
Используй их только для действительно важных случаев: ошибок, подтверждений (особенно разрушительных действий), запросов разрешений.
Самый простой способ — через
isPresented
(булево значение):@State var isPresented = false
VStack {
// UI
}
.alert("Alert Title", isPresented: $isPresented) {
Button("OK") { /* action */ }
Button("Cancel") { }
}
Алёрт появляется, когда
isPresented = true
, и автоматически закрывается после действия пользователя.Можно добавить поясняющий текст:
.alert("Alert Title", isPresented: $isPresented) {
Button("OK") { }
} message: {
Text("Подробнее о проблеме")
}
Это помогает пользователю понять контекст и принять осознанное решение.
📦 Работа с данными
Для подтверждения действий над конкретными объектами есть параметр
presenting
:.alert("Delete Document", isPresented: $isPresented, presenting: document) { document in
Button("Delete", role: .destructive) { delete(document) }
Button("Cancel", role: .cancel) { }
} message: { document in
Text("Удалить '\(document.name)'? Это действие нельзя отменить.")
}
Так SwiftUI сохраняет корректные данные на время отображения диалога.
Если твои ошибки реализуют
LocalizedError
, SwiftUI умеет красиво показывать их в алёртах:.alert(isPresented: $isPresented, error: error) {
Button("Retry") { }
Button("Cancel") { }
} message: { error in
Text(error.recoverySuggestion ?? "Попробуй позже.")
}
Используй краткие заголовки и ясные действия.
Помечай кнопки ролями:
.cancel
, .destructive
.Не перегружай интерфейс — если это не критично, лучше показать баннер или inline-сообщение.
alert
, banner
или sheet
?#АрхитектурныйКод #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Утро. Дебаг. Дедлайн. Рука тянется к заветной кружке... Но что в ней должно быть — бодрящий кофе или успокаивающий чай?
Что предпочитаете вы? Голосуйте и пишите своё мнение в комментариях
❤️ — чай
👍 — кофе
🤝 — вода
#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤17🤝10
IOS - Разработчик — от 220 000 до 330 000 ₽, офис (Москва)
Android Team Lead — удалёнка
Senior iOS Developer — от 450 000 ₽, удалёнка
Руководитель группы разработки Android (ПВЗ) — от 600 000 ₽, удалёнка
Flutter Developer — от 4 000 до 4 800 €, удалёнка
#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Индикатор пульса — это простой, но эффективный элемент пользовательского интерфейса, который помогает визуализировать состояние подключения или активности. В отличие от индикатора загрузки, он передает идею о сигнале, исходящем из центральной точки, что особенно полезно для отображения состояния GPS или сетевого подключения.
Вот полная составная функция, которая отображает индикатор пульса:
@Composable
закрытый метод PulseIndicator(
@DrawableRes значок: Int,
модификатор: Modifier = Modifier
) {
val periodMs = 3600L
val offsetsMs = longArrayOf(0L, 1200L, 2400L)
val startNs = запомнить { System.nanoTime() }
var frameTimeNs by запомнить { mutableLongStateOf(startNs) }
LaunchedEffect(Единица измерения) {
while (true) {
withFrameNanos { now -> frameTimeNs = now }
}
}
(offsetMs: Long)фазафункция: число с плавающей запятой {
val elapsedMs = (frameTimeNs - startNs) / 1_000_000L + offsetMs
return ((elapsedMs % periodMs).toFloat() / periodMs.toFloat())
}
Box(modifier.size(80.dp), contentAlignment = Alignment.Center) {
(p:
Float )Кольцофункция@Composable = Box(
Модификатор
.matchParentSize()
.graphicsLayer {
scaleX = 1f + 0,8f * p
scaleY = 1f + 0,8f * p
alpha = 1f - p
}
.border(1,5.dp, Color.White.copy(alpha = 0,9f), CircleShape)
)
Кольцо(фаза(смещения[0]))
Кольцо(фаза(смещения[1]))
Кольцо(фаза(смещения[2]))
Box(
Modifier
.size(80.dp)
.background(Color.White, CircleShape),
contentAlignment = Alignment.Center
) {
Image(
painter = painterResource(icon),
contentDescription = null,
modifier = Modifier.size(32.dp)
)
}
}
}
Компонуемый элемент использует
withFrameNanos
внутри LaunchedEffect
. Это позволяет получить доступ к текущей временной метке кадра и обеспечивает плавность анимации, пока компонуемый элемент находится на экране. Когда компонуемый элемент покидает композицию, сопрограмма автоматически отменяется.Функция
phase(offsetMs)
преобразует прошедшее время в значение между 0f
и 1f
. Каждое кольцо смещено (0
, 1200
, 2400
мс), поэтому они расширяются в разные моменты. Это создаёт иллюзию непрерывных волн.Каждое кольцо изображается в виде
Box
с круглой рамкой. Его размер и непрозрачность изменяются с помощью graphicsLayer
:scaleX
и scaleY
постепенно увеличиваются от 1f до 1.8f.alpha
плавно переходит от 1f
к 0f
.Вместе они образуют расширяющийся, затухающий круг.
В центре находится сплошной белый круг с указанным значком (например, с меткой местоположения). Он служит статичной точкой привязки, в то время как анимированные кольца расходятся в стороны.
#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁4👾1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13
SQLiteData — это быстрая и лёгкая замена SwiftData от Point-Free, включающая SQL и синхронизацию с CloudKit (и даже шаринг CloudKit), построенная на основе популярной библиотеки GRDB.
Пример:
@FetchAll
var items: [Item]
@Table
struct Item {
let id: UUID
var title = ""
var isInStock = true
var notes = ""
}
Этот пример извлекают элементы из внешнего хранилища данных с использованием типов данных Swift, и автоматически отслеживается SwiftUI, поэтому представления пересчитываются при изменении внешних данных. При этом SQLiteData работает непосредственно с SQLite и может использоваться откуда угодно, включая UIKit, модели @Observable и многое другое.
#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
📄🚫 5 неочевидных ошибок в резюме айтишника, которые убивают отклики
Резюме вроде нормальное, скиллы есть, а отклики уходят в пустоту? Проблема не в вас, а в том, как вы упаковываете свой опыт. Разбираем неочевидные ошибки айтишников при составлении резюме.
👉 Читать статью
🐸 Библиотека мобильного разработчика
#MadeInProglib
Резюме вроде нормальное, скиллы есть, а отклики уходят в пустоту? Проблема не в вас, а в том, как вы упаковываете свой опыт. Разбираем неочевидные ошибки айтишников при составлении резюме.
#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💥 Весь октябрь -40% на курсы для разработчиков в proglib.academy
Бери знания под свой стек:
Python | алгоритмы | математика для Data Science | архитектура кода.
⚡️ Пока скидка действует, апдейтни свои навыки
Бери знания под свой стек:
Python | алгоритмы | математика для Data Science | архитектура кода.
Пока одни ждут «идеальный момент», другие просто учатся.
А потом берут ваши офферы.
⚡️ Пока скидка действует, апдейтни свои навыки
👾 Погружаемся в недра Retrofit
Думаю, многие задумывались о том, что происходит с функциями в интерфейсе Retrofit сервиса, когда мы помечаем их ключевым словом suspend? У некоторых даже есть заблуждение, что для сетевых запросов в таком случае используется корутиновский Dispatchers.IO. Спойлер — это не совсем так.
➡️ В этой статье автор как раз разберёт, как всё работает на самом деле
🐸 Библиотека мобильного разработчика
#свежак #Android
Думаю, многие задумывались о том, что происходит с функциями в интерфейсе Retrofit сервиса, когда мы помечаем их ключевым словом suspend? У некоторых даже есть заблуждение, что для сетевых запросов в таком случае используется корутиновский Dispatchers.IO. Спойлер — это не совсем так.
#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
OptionSet
— это протокол, который представляет параметры в виде битов (битовой маски). Он также предоставляет вашему типу операции, подобные операциям с множествами, такие как объединение и пересечение. OptionSet
позволяет объединять несколько значений.Это отличное решение, если вам нужно предоставить какие-то параметры, настройки, разрешения, стили и т. д.
Давайте напишем код:
struct TasksListOptions: OptionSet {
let rawValue: Int
static let showFilter = TasksListOptions(rawValue: 1 << 0)
static let showSearch = TasksListOptions(rawValue: 1 << 1)
static let showSort = TasksListOptions(rawValue: 1 << 2)
static let showLayoutSelector = TasksListOptions(rawValue: 1 << 3)
}
Каждый вариант
rawValue
представляет собой один бит в одном и том же целом числе: 1 << 0
— это 0001
, 1 << 1
— это 0010
, 1 << 2
— это 0100
и так далее. При объединении вариантов Swift объединяет их биты с помощью оператора побитового ИЛИ (|
), поэтому showFilter
+ showSort
становится 0101
. Таким образом, несколько вариантов объединяются в одно компактное число, в котором каждый бит чётко обозначает отдельный вариант.Как уже упоминалось, замечательной особенностью
OptionSet
является возможность комбинировать параметры. Один из распространённых сценариев — объявление предустановок по умолчанию с комбинированными значениями. Например, можно создать all
параметр для представления всех параметров. В нашем примере мы можем создать предустановки для разных типов списков:struct TasksListOptions: OptionSet {
...
static let today: TasksListOptions = [.showFilter, .showSearch]
static let allTasks: TasksListOptions = [.showFilter, .showSearch, .showSort, .showLayoutSelector]
}
Теперь ваша модель представления может использовать один из этих шаблонов для включения или отключения некоторых функций.
@Observable
final class TasksListViewModel {
private let options: TasksListOptions
}
#буст #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Что является основной причиной потенциального краша?
Anonymous Quiz
15%
Нет проверки isAdded перед обновлением UI
11%
Отсутствие отмены предыдущей корутины при повторном вызове
34%
Использование lifecycleScope вместо viewLifecycleOwner
23%
Неправильная обработка исключений
17%
Посмотреть ответ
❤1
Папка Derived Data (производные данные) — один из важнейших каталогов, используемых iOS-разработчиком. Хотя вы не работаете с ней напрямую, Xcode активно использует её для кэширования информации и оптимизации разработки.
Тем не менее, у iOS-разработчиков есть множество возможностей максимально эффективно использовать Derived Data. Будь то удаление файлов для оптимизации сборки или просмотр информации о каталоге, все эти действия могут улучшить работу разработчиков.
#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
adb shell pm clear
– мгновенный сброс данных приложения без переустановкиМгновенно очищает все данные и кэш приложения, возвращая его в состояние "только что установленного". Идеально для тестирования сценариев первого запуска.
1. Тестирование первого запуска:
adb shell pm clear com.yourapp.package && adb shell am start -n com.yourapp.package/.MainActivity
2. Сброс авторизации:
Больше не нужно удалять/переустанавливать приложение чтобы проверить сценарий логина заново.
3. Очистка перед демо:
Убедитесь, что приложение покажет именно то, что вы планировали на демонстрации.
Сброс + запуск:
adb shell pm clear com.yourapp.package && sleep 2 && adb shell am start -n com.yourapp.package/.MainActivity
Сброс нескольких приложений:
for app in com.app1 com.app2 com.app3; do
adb shell pm clear $app
done
• Сохраняет APK – не переустанавливает приложение
• Быстрее удаления – экономит время на тестах
• Работает на всех устройствах – включая production-сборки
Как часто вы сбрасываете данные при тестировании?
#буст #AllLevels #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Пока мы думали как бы вам рассказать про наш Х, обнаружили любопытную вещь: если пользователь не залогинен в Х, то лента нашего паблика пустая — ни одного поста.
Теперь разбираемся, это недоработка или новая фича, мотивирующая авторизацию
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Как превратить свой MRR в кэш одним лотом 💸
Если ваш проект уже генерирует стабильную прибыль, возможно, пора её зафиксировать, чтобы вложиться во что-то большее. В Telegram как раз запустили канал, где можно продать своё приложение или сайт напрямую инвестору.
Это не просто доска объявлений. Каждый лот проверяют, а продавца буквально ведут за руку во время сделки, чтобы всё прошло гладко 🤝. Инвесторы получают готовую аналитику и прогнозы по подписчикам.
Авторы канала считают, что это надёжнее очередного щиткоина и профитнее, чем сдавать в аренду бабушкину квартиру 🏠. А для тех, кто готов вложиться по-крупному, соберут индивидуальный портфель проектов.
Заглянуть на витрину или выставить свой лот → @approckvc
Если ваш проект уже генерирует стабильную прибыль, возможно, пора её зафиксировать, чтобы вложиться во что-то большее. В Telegram как раз запустили канал, где можно продать своё приложение или сайт напрямую инвестору.
Это не просто доска объявлений. Каждый лот проверяют, а продавца буквально ведут за руку во время сделки, чтобы всё прошло гладко 🤝. Инвесторы получают готовую аналитику и прогнозы по подписчикам.
Авторы канала считают, что это надёжнее очередного щиткоина и профитнее, чем сдавать в аренду бабушкину квартиру 🏠. А для тех, кто готов вложиться по-крупному, соберут индивидуальный портфель проектов.
Заглянуть на витрину или выставить свой лот → @approckvc
🔥1🤝1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
❤2🥱2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7❤1