Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 590новых вакансий за сутки·54 897вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 617
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 827
  • Облачные технологии6 726
  • QA вакансии2 191
  • Android1 320
  • Инженер данных862
  • Продакт-менеджер318

Разработка

  • iOS1 233
  • Backend вакансии1 214
  • AI вакансии551
  • Fullstack вакансии502
  • Frontend вакансии425
  • Mobile вакансии28

По стеку

  • Go5 252
  • Java3 137
  • Kotlin1 125
  • Node.js1 011
  • Rust852
  • .NET665
  • PHP320
  • C++270
  • C#207

DevOps и инфраструктура

  • Kubernetes3 956
  • Linux-инфраструктура2 871
  • DevOps вакансии2 690
  • Terraform / IaC2 199
  • Мониторинг и Observability1 084
  • CI/CD914
  • SRE314
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных529
  • Data Scientist437
  • Бизнес-аналитик398
  • Системный аналитик68

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США25 820
  • Вакансии в Европе10 304
  • Работа в России3 646
  • Вакансии в Канаде2 269

По формату

  • Удалённые вакансии42 570
  • Релокация в США25 820
  • Гибридная работа5 725
  • Офисная работа4 498

По уровню

  • Senior вакансии22 658
  • Middle вакансии11 501
  • Junior вакансии3 898

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise188 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Jetpack ComposeВсе вопросы
Jetpack ComposeJuniorТеория

В чём разница между stateful и stateless composable?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Stateful composable хранит состояние внутри через remember, stateless — получает данные параметрами и сообщает об изменениях через лямбды. Рекомендуемый паттерн: stateless-компонент + stateful-обёртка, состояние хранится во ViewModel.

Stateful Composable

Хранит состояние внутри себя с помощью remember или rememberSaveable. Удобен для изолированных UI-компонентов, у которых состояние не нужно снаружи.

@Composable
fun ExpandableCard(title: String, body: String) {
    var expanded by remember { mutableStateOf(false) }  // состояние внутри

    Card {
        Column {
            Row(
                modifier = Modifier
                    .clickable { expanded = !expanded }
                    .padding(16.dp)
            ) {
                Text(title, Modifier.weight(1f))
                Icon(
                    if (expanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore,
                    contentDescription = null
                )
            }
            if (expanded) {
                Text(body, Modifier.padding(16.dp))
            }
        }
    }
}

Плюс: просто использовать. Минус: состояние закрыто — нельзя управлять снаружи, сложно тестировать.

Stateful и Stateless Composable

Разделение на stateful и stateless — ключевой архитектурный паттерн в Compose, называемый state hoisting (подъём состояния).

Stateless Composable

Не содержит собственного состояния. Принимает данные через параметры и сообщает об изменениях через лямбды. Полностью предсказуем и тестируем.

@Composable
fun ExpandableCard(
    title: String,
    body: String,
    expanded: Boolean,           // состояние снаружи
    onExpandToggle: () -> Unit   // событие наружу
) {
    Card {
        Column {
            Row(
                modifier = Modifier
                    .clickable { onExpandToggle() }
                    .padding(16.dp)
            ) {
                Text(title, Modifier.weight(1f))
                Icon(
                    if (expanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore,
                    contentDescription = null
                )
            }
            if (expanded) {
                Text(body, Modifier.padding(16.dp))
            }
        }
    }
}

Паттерн: stateful обёртка над stateless

Типичное решение — пара функций: stateless-компонент для переиспользования и testability, и stateful-обёртка для удобства.

// Stateless — используется в сложных сценариях и тестах
@Composable
fun EmailField(
    value: String,
    onValueChange: (String) -> Unit,
    isError: Boolean = false
) {
    OutlinedTextField(
        value = value,
        onValueChange = onValueChange,
        label = { Text("Email") },
        isError = isError
    )
}

// Stateful — для быстрого использования
@Composable
fun EmailFieldStateful() {
    var email by remember { mutableStateOf("") }
    EmailField(
        value = email,
        onValueChange = { email = it }
    )
}

State hoisting в ViewModel

В реальных экранах состояние поднимается в ViewModel:

class LoginViewModel : ViewModel() {
    var email by mutableStateOf("")
        private set

    fun onEmailChange(value: String) { email = value }
}

@Composable
fun LoginScreen(vm: LoginViewModel = viewModel()) {
    EmailField(
        value = vm.email,
        onValueChange = vm::onEmailChange
    )
}

Подводные камни

  • Слишком раннее поднятие состояния — состояние в ViewModel, которое нужно только локально (например, флаг «dropdown open»), загромождает ViewModel.
  • Слишком позднее поднятие — два независимых composable не могут синхронизироваться, потому что состояние у каждого своё.
  • Передача изменяемого объекта вниз вместо лямбды — нарушает принцип однонаправленного потока данных (UDF).
  • Stateful composable трудно тестировать юнит-тестами — не видно состояния снаружи.
  • Смешение бизнес-логики и UI-состояния в одном composable — переполненный компонент, сложный для поддержки.
  • Поднятие состояния слишком высоко («god state» в корневом composable) — все дочерние функции рекомпонируются при любом изменении.

Частые вопросы на собеседовании

  • Что такое State в Jetpack Compose и как работает state hoisting?
  • Что такое recomposition и что её вызывает в Jetpack Compose?
  • В чём разница между remember и rememberSaveable?
  • Каковы лучшие практики производительности в Jetpack Compose (стабильность, пропускаемость)?

Типичные ошибки

  • Объяснять «stateful и stateless composable» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Stateful компоненты сложнее переиспользовать, если состояние нужно синхронизировать с ViewModel или navigation.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «stateful и stateless composable» своими словами и связывает ее с кодом.
  • Называет механизм: Обычно публичный API строят stateless, а удобную stateful-обертку добавляют рядом для простых случаев.
  • Видит production-последствие: Stateful компоненты сложнее переиспользовать, если состояние нужно синхронизировать с ViewModel или navigation.

Как вы знаете этот вопрос?

Проверить себя по теме Jetpack Compose →

Источники

  • https://developer.android.com/develop/ui/compose/state
←Предыдущий вопросКак Jetpack Compose интегрируется с компонентом архитектуры ViewModel?Следующий вопрос→Что такое `rememberCoroutineScope` и как он используется?

Связанные темы

Jetpack Composestateful-stateless-reasoningui-state