Расскажи про свой опыт с Compose

Ответ

Работал с Jetpack Compose в нескольких проектах, включая полный редизайн legacy-приложения. Основные моменты:

  • Реализовывал сложные кастомные UI (анимированные списки, жесты, модификации Material компонентов)
  • Оптимизировал производительность через remember, derivedStateOf, LazyColumn/LazyRow
  • Интегрировал с ViewModel и Flow для state management
  • Работал с навигацией через Compose Navigation и deep links

Пример простого Composable:

@Composable
fun Greeting(name: String) {
    var clicked by remember { mutableStateOf(false) }
    Box(
        modifier = Modifier
            .clickable { clicked = !clicked }
            .background(if (clicked) Color.Green else Color.White)
    ) {
        Text("Hello $name!")
    }
}

Плюсы Compose: декларативный подход, меньше кода, живая предпросмотрка. Сложности: пока не все библиотеки адаптированы, некоторые нюансы с тестированием.

Ответ 18+ 🔞

А, Jetpack Compose, говоришь? Ну, это я знаю, не понаслышке. Пришлось вот на одном проекте с этой штукой вплотную познакомиться, когда старый приложение, которое выглядело, будто на дворе 2002-й год, решили на современные рельсы переводить. Ёпта, это был пиздец, конечно, но интересный.

Так вот, основные моменты, которые в голове отложились, пока я с этой мартышкой-композом разбирался.

Во-первых, кастомные интерфейсы. Ну, там не просто кнопочки-поля, а всякая анимированная хрень: списки, которые по-хитрому сворачиваются, жесты кастомные, чтобы свайпать и получать по морде от дизайнера за неидеальную физику. Material компоненты так дорабатывал, что от оригинала, бля, одно название оставалось. Но зато красиво, ядрёна вошь!

Во-вторых, производительность. Тут, чувак, главное — не накосячить. Поначалу всё перерисовывалось от любого чиха, терпения ноль ебать. Потом врубился, что remember, derivedStateOf и ленивые колонки (LazyColumn) — это святое. Без них твое приложение просто сожрёт батарею и память, как не в себя. Это как раз тот случай, когда нужно думать головой, а не просто код пихать.

В-третьих, стейт-менеджмент. Интегрировал всё это дело с ViewModel и Flow. В принципе, логично: вьюмодель держит состояние, композ его отрисовывает. Когда поток данных обновляется — интерфейс сам перерисовывается. Красота, в рот меня чих-пых! Хотя поначалу мозг немного взрывался, пока не уложил в голове, как это всё вместе работает.

Ну и навигация, куда без неё. Использовал Compose Navigation. С глубокими ссылками (deep links) тоже возился, чтобы из уведомлений или браузера сразу в нужный экран кидало. В целом, удобная штука, хотя иногда тоже свои костыли требуются.

Вот тебе простой пример кода, чтобы понять, о чём речь вообще:

@Composable
fun Greeting(name: String) {
    var clicked by remember { mutableStateOf(false) }
    Box(
        modifier = Modifier
            .clickable { clicked = !clicked }
            .background(if (clicked) Color.Green else Color.White)
    ) {
        Text("Hello $name!")
    }
}

Видишь? Объявляешь переменную clicked, которая реагирует на клик. Вешаешь модификатор на Box, который меняет фон. Всё. Никаких findViewById, никаких биндингов в XML. Чистая декларативка: "хочу коробку, которая красится в зелёный при клике". И система сама делает, что нужно.

Плюсы, которые прям чувствуются:

  • Декларативный подход. Говоришь что нужно, а не как это сделать. Голова меньше болит.
  • Меньше кода. Серьёзно, в разы. Особенно если сравнивать с тем адом из XML и бойлерплейт-кода в активити.
  • Живая предпросмотрка (@Preview). Ты прямо в студии видишь, как меняется твой UI, когда код правишь. Это просто волшебство, ебать копать! Не нужно каждый раз запускать эмулятор.

Но и сложности, куда без них:

  • Библиотеки. Не все популярные либы ещё переехали на Compose. Иногда приходится использовать interoperability с обычными View, а это такой костыль, что хуй с горы. Подозрение ебать чувствую, когда с этим работаю.
  • Тестирование. Тут свои нюансы. Не то чтобы невозможно, но подходы немного другие. Привыкать нужно.
  • Ментальный сдвиг. Если ты 10 лет на XML и императивном коде просидел, то первые недели будешь просто охуевать и пытаться сделать всё по-старому. Но потом врубаешься, и летать начинаешь.

В общем, инструмент мощный, будущее за ним, походу. Но как любой новый фреймворк, требует времени и нервов на освоение. Главное — начать с простого, а не лезть сразу делать анимированный список с параллакс-эффектом, а то сам от себя охуеешь.