Что такое @Composable функция

Ответ

@Composable — это аннотация в Jetpack Compose, которая обозначает функции, описывающие UI. Такие функции могут вызывать другие @Composable функции и автоматически реагируют на изменения состояния.

Особенности:

  • Не возвращают значение явно (возвращают Unit)
  • Могут вызываться только из других @Composable функций или setContent
  • Имеют возможность рекомпозиции при изменении состояния

Пример:

@Composable
fun Greeting(name: String) {
    Text(text = "Hello, $name!")
}

Ответ 18+ 🔞

Вот, смотри, объясняю на пальцах, как есть. Есть такая штука — @Composable. Это, блядь, не просто аннотация, это как волшебное слово для Jetpack Compose. Сказал его над функцией — и всё, эта функция теперь описывает кусок интерфейса. Прямо как будто взял кисточку и начал красить, только кодом.

Что она делает, эта твоя композебл-функция? Она может звать других таких же композебл-товарищей и, внимание, главная фишка — она сама обновляется, когда данные меняются. Не надо вручную тыкать invalidate() или ещё какую хуйню. Сказал name = "Вася", а потом name = "Петя" — и интерфейс сам, блядь, перерисуется. Магия, ёпта!

Важные правила, чтобы не выстрелить себе в ногу:

  • Ничего не возвращает. Ну то есть возвращает Unit, по-нашему — void. Её задача нарисовать, а не посчитать.
  • Вызывать её можно только в особых местах. Или из другой такой же композебл-функции, или из этого setContent{}. Попробуешь вызвать из обычного метода — получишь пиздюлину от компилятора, он тебе сразу: «Ты куда, мудак?».
  • Рекомпозиция — её конёк. Это когда состояние поменялось, и функция перезапускается, чтобы отрисовать всё заново с новыми данными. Но умно, не всю, а только то, что надо.

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

@Composable
fun Greeting(name: String) {
    Text(text = "Hello, $name!")
}

Всё! Объявил функцию, повесил @Composable, внутри вызвал другую композебл-функцию Text. Передал туда строку. Готово. Теперь, если name изменится где-то там, в состоянии, этот Text сам обновится на экране. Красота, ядрёна вошь!