Android Mobile | YeaHub
431 subscribers
332 photos
21 videos
597 links
Теория, подготовка к интервью и курсы для Android разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#полезное
😊 Calf

Это библиотека для Compose Multiplatform, упрощающая создание адаптивных пользовательских интерфейсов и доступ к платформенно-специфичным API!

✅ Она предоставляет готовые компоненты для UI, работы с файлами, WebView, разрешениями и мультимедиа на Android, iOS, настольных и веб-платформах.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1
#Собес
🤔 Объясните концепцию делегатов в Kotlin.

Делегаты в Kotlin позволяют делегировать реализацию свойств или функций другим объектам. Это упрощает реализацию таких задач, как ленивая инициализация ( lazy ), наблюдение за изменениями ( observable ) или добавление дополнительного поведения без наследования.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
🤓 KMP-App-Template-Native — шаблон для создания приложений на Kotlin Multiplatform с использованием нативных UI для Android и iOS!

✅ Он включает общую бизнес-логику и обработку данных, а также нативные UI-реализации с использованием Jetpack Compose для Android и SwiftUI для iOS. Шаблон использует различные библиотеки Kotlin Multiplatform для сетевых запросов, сериализации JSON, внедрения зависимостей и работы с ViewModel.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🔥1
#полезное
🤯 Koin — это лёгкий и прагматичный фреймворк для внедрения зависимостей (Dependency Injection) на языке Kotlin!

✅ Он поддерживает как Kotlin Multiplatform, так и Android. Koin предоставляет удобный DSL для настройки зависимостей, минимизирует избыточность кода и интегрируется с различными экосистемами, включая Jetpack Compose и Ktor.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👍 Ныне популярный vibe-coding теперь и в Android Studio благодаря Firebender!

По своей сути, то же самое, что и Cursor, Trae и windsurf, но встроено внутрь Android Studio. Демо для тех кто слышит об этом впервые можно глянуть тут: https://firebender.com/

Это кратно удобнее, чем задавать вопросы в чат. Доступны как популярные модели claude-3.7, так и локально запущенные llm. Пробовали ли на своих проектах работу с AI агентами в паре?

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Каково назначение ключевого слова by в Kotlin?

Ключевое слово by используется для делегирования. Оно позволяет классу передавать выполнение функций или управление свойством другому объекту. Это упрощает повторное использование кода и добавление дополнительного поведения к уже существующей функциональности.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
😊 KoalaPlot — это библиотека для создания графиков и диаграмм, основанная на Compose Multiplatform и написанная на языке Kotlin!

✅ Она позволяет создавать интерактивные диаграммы для Android, десктопа, iOS и веба с использованием единого API. Поддерживает разнообразные виды графиков, такие как круговые, линейные, столбчатые, а также графики на основе полярных координат. В библиотеке предусмотрена широкая настройка визуальных элементов, таких как цвета, шрифты, взаимодействие с пользователем и анимации.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#полезное
😵‍💫 EitherNet — это библиотека для Kotlin, предназначенная для обработки API-ответов в приложениях!

✅ Она предоставляет типизированный подход к обработке результатов сетевых запросов, используя sealed-классы для представления успешных и неудачных ответов. Это упрощает работу с ошибками, исключая необходимость использования исключений для обработки ошибок. Например, можно различать типы ошибок, такие как сетевые сбои, HTTP-ошибки или специфические API-ошибки, что делает код более безопасным и понятным.

✅ Библиотека интегрируется с Retrofit, позволяя разработчикам легко подключить её к существующим API-запросам. Она поддерживает аннотации, такие как @.DecodeErrorBody, для автоматической обработки тела ошибок HTTP-ответов. Это делает работу с API более удобной и предсказуемой, улучшая качество обработки ошибок и делая код проще для чтения и поддержки.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
#ЛитКод
Задача: 364. Nested List Weight Sum II

Вам дан вложенный список целых чисел nestedList. Каждый элемент является либо целым числом, либо списком, элементы которого также могут быть целыми числами или другими списками.

Глубина целого числа — это количество списков, внутри которых оно находится. Например, вложенный список [1,[2,2],[[3],2],1] имеет значение каждого целого числа, установленное равным его глубине. Пусть maxDepth будет максимальной глубиной любого целого числа.
Вес целого числа определяется как maxDepth - (глубина целого числа) + 1.

Верните сумму каждого целого числа в nestedList, умноженную на его вес.

Пример:
Input: nestedList = [[1,1],2,[1,1]]
Output: 8
Explanation: Four 1's with a weight of 1, one 2 with a weight of 2.
1*1 + 1*1 + 2*2 + 1*1 + 1*1 = 8


👨‍💻 Алгоритм:

1⃣Инициализировать первый уровень BFS-дерева, добавив все элементы из входного nestedList в очередь.

2⃣Для каждого уровня извлекать передний элемент из очереди. Если это список, то добавить его элементы в очередь. В противном случае обновить значения sumOfElements, maxDepth и sumOfProducts.

3⃣Когда очередь станет пустой, вернуть значение (maxDepth + 1) * sumOfElements - sumOfProducts.

😎 Решение:
class Solution {
fun depthSumInverse(nestedList: List<NestedInteger>): Int {
val queue: Queue<NestedInteger> = LinkedList(nestedList)
var depth = 1
var maxDepth = 0
var sumOfElements = 0
var sumOfProducts = 0

while (queue.isNotEmpty()) {
val size = queue.size
maxDepth = maxOf(maxDepth, depth)

repeat(size) {
val nested = queue.poll()

if (nested.isInteger()) {
val value = nested.getInteger()
sumOfElements += value
sumOfProducts += value * depth
} else {
queue.addAll(nested.getList())
}
}
depth++
}
return (maxDepth + 1) * sumOfElements - sumOfProducts
}
}


👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Объясните модификатор suspend в Kotlin.

Модификатор suspend в Kotlin используется для пометки функций, которые могут быть приостановлены и возобновлены в рамках корутин. Это позволяет функции выполнять асинхронные операции, не блокируя поток, и вызывать другие приостанавливаемые функции внутри себя.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#полезное
🥺 AAY-chart — это библиотека для создания графиков в приложениях на Kotlin Multiplatform и Jetpack Compose!

✅ Она поддерживает несколько типов диаграмм, таких как линейные, столбчатые, круговые, пончиковые и радарные.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#полезное
😊 Это база: companion object (также Singleton)

Объекты можно объявлять внутри класса, при этом нет каких-либо ограничений по их количеству. Но только один объект можно пометить ключевым словом companion object в рамках одного класса.

Синглтон-свойство companion object достигается за счет того, что он создается внутри класса в качестве статического поля. Он будет инициализирован при первом обращении к нему или при создании первого экземпляра класса, в котором он объявлен.

Важно отметить, что companion object будет инициализирован первым, а затем уже будет создан экземпляр класса:

class MyClass {
init {
// Выполняется всегда после инициализации companion object
}
companion object {
init {
// Выполняется всегда перед блоком init содержащего класса
}}}
val myClass = MyClass()


Такому объекту можно не указывать свое имя, и обращаться к методам и свойствам объекта через имя содержащего его класса без явного указания имени объекта.

class SomeClass { 
companion object {
fun create()
}
}
val someClass = SomeClass.create()


Компилируется в public static final class на Java. Работает подобно ключевому слову static в Java.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#статьи
🤯 Размещение UI-компонентов в пределах отступов Safe Area

Безопасная область (safe area) — это часть экрана, которую не загораживают элементы системного UI, такие как строка состояния, панель навигации, динамический остров и пр.

По умолчанию SwiftUI гарантирует, что представления будут размещены в этой безопасной области, чтобы сохранить видимость и доступность. Однако бывают случаи, когда разработчикам требуется больше контроля над тем, как представления взаимодействуют с этими границами.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 В чем разница между init и constructor в Kotlin?

constructor создаёт экземпляр класса и принимает параметры, а блок init выполняет инициализацию, общую для всех конструкторов. Блок init всегда выполняется после вызова конструктора, что позволяет настроить обьект или проверить параметры.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
#полезное
🤓 Kopy — это библиотека для Kotlin, предназначенная для удобного глубокого копирования объектов!

🚩Она позволяет создавать новые экземпляры классов данных с измененными свойствами, включая вложенные объекты, без необходимости вручного копирования каждого поля. Это особенно полезно при работе со сложными структурами данных, где требуется изменить только часть объекта, сохранив остальные данные неизменными.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😎 Пишем тесты для compose навигации

Все благодаря type-safe навигации, представленной недавно. Внутри статьи вариант для старого подхода и способ миграции его на новый подход. Для тестов используется TestNavHostController, позволяющий верифицировать экран на котором находимся. Пример:

@Test
fun whenUserIsInBookSearch_andClickOnABook_verifyDestinationIsBookDetail() {
// User is in BookSearch
composeTestRule.runOnUiThread {
navController.setCurrentDestination(NavigationRoutes.BOOK_SEARCH)
}

// User clicks on the first book
composeTestRule.onAllNodesWithTag(bookCardTestTag)[0].performClick()
assertTrue { navController.currentDestination?.route == NavigationRoutes.BOOK_DETAIL }
}


Выглядит очень просто, в связи с чем вопрос: Тестирование навигации это тесты ради тестов или валидный способ проверки бизнес-логики?

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
🫠 Анализируем время сборки и рисуем графики

🟠 Базовый Build Analyzer из Android studio покажет куда тратиться основная масса времени в сборке.
🟠 Аналогичный репорт можно получить через ./gradlew --profile assemble[Flavor]Debug.
🟠 Так же скан можно выгрузить в web и пошарить с коллегами через ./gradlew --scan. Там вы увидите более подробную разбивку по затраченному времени на тот или иной шаг сборки
🟠 Gradle Profiler и благодаря его удобной функции - сценарии, можно получить наглядную статистику. Больше примеров тут

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#Собес
🤔 Объясните концепцию typealias в Kotlin.

typealias в Kotlin позволяет задать новое имя для существующего типа, улучшая читаемость и удобство кода. Оно не создаёт новый тип, а только предоставляет альтернативное имя. Используйте typealias, чтобы сделать код более понятным, особенно при работе с длинными или повторяющимися типами.

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
👨‍💻 RSocket-Kotlin — это мультиплатформенная реализация протокола RSocket на Kotlin, предназначенная для реактивного обмена сообщениями между клиентами и серверами!

Она поддерживает различные модели взаимодействия, включая fire-and-forget, request-response, request-stream и bidirectional channels. Библиотека основана на kotlinx.coroutines и ktor-io, что делает ее удобной для работы с асинхронными операциями и сетевыми приложениями.
Гитхаб

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Shader Ripple Effect Playground — библиотека шейдерных AGSL эффектов

Shader Ripple Effect Playground — библиотека шейдерных AGSL эффектов для Android. Есть эффект пульсации, реагирующий на касание, непрерывная волновая анимация с настраиваемыми параметрами, переход раскрытия содержимого с эффектом пульсации — все с настрйоками. Полная совместимость с любым элементом пользовательского интерфейса Jetpack Compose, простая интеграция с минимальным количеством кода.
Shader Ripple Effect Playground на GitHub

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM