Android Good Reads
3.88K subscribers
344 photos
13 videos
1 file
2K links
Самые интересные статьи, видео и новости, связанные с Android разработкой. Не больше трёх материалов в день.

Автор канала: @Lamprof

Размещение рекламы: @tanyasanovna
Download Telegram
Немного про синхронизацию в современном kotlin

👉 Для синхронизации 1 значения или конкретной коллекции используем Atomic/ConcurrentCollections
👉 Для синхронизации suspend функций используем Dispatcher
👉 В ином случае synchronized
👉 В очень редких случаях когда важен порядок и скорость, а по другому никак - используем Mutex
val является immutable в kotlin
Anonymous Poll
55%
Правда
45%
Не правда
Разбираемся дает ли val обьекту свойство Immutable

Имутабельность нам нужна для:
👉 Многопоточки
👉 Предстказуемого поведения обьекта и отстутсвия сайд эффектов
👉 Корректного описания состояния обьекта

val в байт коде выглядит вот так:

private final Ljava/lang/String; text
@Lorg/jetbrains/annotations/NotNull;() // invisible

Что гарантирует нам постоянство ссылки, но не обьекта

Тоже валидный код, где мы переопределяем val как var

interface State<out T> {
val value: T
}

interface MutableState<T> : State<T> {
override var value: T
operator fun component1(): T
operator fun component2(): (T) -> Unit
}

val state: State<String> = remember { mutableStateOf("text") }
(state as MutableState<String>).value = "changed"


Документация нигде не определяет val как immutable, только как переменную доступную только для чтения

Задачка со звездочкой. Как создать полностью неизменяемый обьект?
🎁 У нас получится разыграть 1 билет на Podlodka Android Crew. Чтобы участвовать в конкурсе, надо оставить комментарий к этому посту с ответом на самый популярных вопрос с поведенческой части интервью:

Самая большая ошибка, которую вы совершили в процессе разработки, и чему она вас научила?

Победитель будет выбран по самому большому числу реакций 15 сентября в 21:00
Please open Telegram to view this post
VIEW IN TELEGRAM
📍 Команда Kotlin обновила свои планы!

👉 Работают над плагинами с поддержкой K2, будет быстрее и стабильнее
👉 Для KMM нас ждет первый релиз Swift Export. Будет лучше работать автокомплит и станет проще создавать новые kmm библиотеки
👉 Ставка на комьюнити! Упрощение процесса разработки и публикации библиотек, инструментов и фреймворков на Kotlin
👉 Дальнейшее улучшение самого языка Kotlin. Улучшение производительности, за счет более чистого кода

Подробнее тут: https://kotlinlang.org/docs/roadmap.html
Please open Telegram to view this post
VIEW IN TELEGRAM
Одна из причин перейти на Kotlin 2.0 это уменьшение количества кода ради кода. ExplicitBackingFields, как хороший пример

class SomeViewModel {
val city: StateFlow<String>
field = MutableStateFlow("")

fun updateCity(newCity: String) {
city.value = newCity // обрабатывается как MutableStateFlow
}
}

fun outside(vm: SomeViewModel) {
vm.city // обрабатывается как StateFlow, вызов геттера
}
Android Good Reads
Исправляем автоимпорт в Android Studio При автоимпорте на первое место часто всплывают ненужные пакеты. Например Modifier из java.lang.reflect, а не из compose или Flow из java.util.concurrent, а не из пакета с корутинами Как исправить: 👉 Alt/Opt + Enter…
Продолжаем тему удобства использования Android Studio. Улучшаем автокомплит в смешанных Java-Kotlin проектах

👉 Невероятно расстраивает видеть на первом месте .component1(), .component2() при обращении к data class из Java кода
👉 Нужно сделать плагин с реализацией CompletionContributor со своим собственным списком приоритетов
👉 Сам плагин для студии и уже готовым фиксом можно скачать тут
Compiler Explorer в связке с Android

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

Инструмент Compiler Explorer (16k+ ⭐️) покажет по шагам превращение вашего кода в байткод. Чтобы попробовать - не забудьте выбрать в левом окошке Android Kotlin вместо C++.

Более прикладной пример - то как выглядит минификация приложения. R8 удаляет мертвый код, оптимизирует байткод и обфусцирует его. В целом, результат можно увидеть и в APK Analyzer, но не отдельные кусочки кода, как тут: https://godbolt.org/
Please open Telegram to view this post
VIEW IN TELEGRAM
Визуальный гайд по структуре мультиплатформенных проектов

Хотите быстро объяснить коллеге, как устроить архитектуру с KMP/CMP? Это лучший вариант!

👉 Compose MP c разделением по слоям
👉 Kotlin MP с общим presentation слоем. Странный вариант, есть идеи когда это выигрывает?
👉 Kotlin MP c общим data слоем.
👉 Kotlin MP, как общий модуль для нативных приложений. На мой взгляд это самый лучший вариант, но продать эту идею iOS команде еще не получалось
👉 Стандартный вид CMP предлагаемый из шаблонов

Больше возможных архитектурных шаблонов с KMP/CMP: https://github.com/TheSetox/kmp-sample-diagrams
Устали писать обслуживающий код? Автоматизируем все с помощью KSP

В кратце, автор генерирует вспомогательные класса для навигации, которая с последними обновлениями стала слишком тяжелой. Все работает благодаря самописным аннотациям и генератору. Используете ли вы нечто похожее?
#вакансия
Команда Яндекс 🌍 Путешествий ищет того, кто поможет сделать лучшее Android-приложение для бронирования отелей. Откликайтесь на вакансию, если вы…

📍 готовы писать код самостоятельно и быстро
📍 можете обсудить детали реализации и предложить варианты выполнения задачи
📍 способны отвечать за выполненную работу

Подробнее про стек, условия и задачи — по ссылке 💛
Please open Telegram to view this post
VIEW IN TELEGRAM
Красивое решение для LazyList с канала мобильное чтиво. Многие в процессе миграции с xml на compose, так что берите элегантный хак на заметку!
Forwarded from Мобильное Чтиво (Maxim Kachinkin)
This media is not supported in your browser
VIEW IN TELEGRAM
🎨 Главное — чтобы было красиво!

Тесты, шместы, архитектура — это всё прекрасно. Но в итоге главное — чтобы было красиво! Я вот вспомнил одну нашу фичу, где надо было сделать кастомный контрол типа табов, которые плавно анимировались, центрировались на выбранном, а потом обратно схлопывались. Всё на Compose, конечно. 💻

И что вы думаете? Контентные паддинги в LazyRow не помогли, игры с отступами тоже. Даже использование horizontalScroll не дало результата. Пришлось думать дальше. 🤔

А как в итоге сделали? Ну, это можно назвать костылём (или нормальным решением, если вам так больше нравится). Добавили "фейковые" элементы в начале и в конце списка и анимировали их размер. 🙃

Используем LazyRow и делаем первый и последний item просто прозрачные Spacer, чтобы создать видимость отступов. Плавно и красиво анимируем их ширину, и всё! 💫 На самом деле не совсем всё: это тянет за собой много всего, чтобы учитывать эти элементы по-особенному (чтобы не кликались, не анимировались, не участвовали в выборе и т.д.).

Как заметили в комментариях, это создает дополнительные рекомпозиции 🫣, что не может не радовать. Такой трейдофф решили взять. Но в итоге всё выглядит плавно, аккуратно, ну и просто красиво! 🌟

В комментах я добавлю скриншот кода и видосик — там видно, как это анимируется и центрируется. 🎥

А у вас какие были проблемы из-за красоты? Поделитесь! 😎

#android #compose #ui #lazyrow
В понедельник утром оптимизируем загрузку изображений в compose и kotlin MP

Сохраню вам время. Общий посыл - используйте landscapist (2100+ ⭐️) Шустрый плагин, совместимый с coil, fresco и glide.
Работает как с последним coil3, превьюхами Android Studio и wasm. Используем?
Please open Telegram to view this post
VIEW IN TELEGRAM