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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

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

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

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

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

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

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

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа5 209
  • Офисная работа3 834

По уровню

  • Senior вакансии22 591
  • Middle вакансии12 174
  • Junior вакансии4 013

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

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

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

Что такое rememberCoroutineScope и как он используется?

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

rememberCoroutineScope() возвращает CoroutineScope, привязанный к жизненному циклу composable: он автоматически отменяется при уходе composable из дерева. Используется для ручного запуска корутин из обработчиков событий (onClick, жесты).

Базовый пример

@Composable
fun SaveButton(viewModel: FormViewModel) {
    val scope = rememberCoroutineScope()
    var isSaving by remember { mutableStateOf(false) }

    Button(
        onClick = {
            scope.launch {                  // запуск из обработчика события
                isSaving = true
                viewModel.save()
                isSaving = false
            }
        },
        enabled = !isSaving
    ) {
        if (isSaving) CircularProgressIndicator(Modifier.size(18.dp))
        else Text("Сохранить")
    }
}

rememberCoroutineScope в Jetpack Compose

rememberCoroutineScope() возвращает CoroutineScope, привязанный к точке вызова в композиции. Область автоматически отменяется, когда composable покидает экран (уходит из композиции). Это позволяет запускать корутины из обработчиков событий (кликов, жестов) — мест, где нельзя использовать suspend-функции напрямую.

Отличие от LaunchedEffect

  • LaunchedEffect — запускается автоматически при входе в композицию и при смене ключей; нельзя вызвать из onClick.
  • rememberCoroutineScope — даёт ручной контроль: запускай корутину тогда, когда пользователь сделал действие.

Показ Snackbar

Типичный паттерн — вызов SnackbarHostState.showSnackbar() из кнопки:

@Composable
fun DeleteItemScreen() {
    val snackbarHostState = remember { SnackbarHostState() }
    val scope = rememberCoroutineScope()

    Scaffold(
        snackbarHost = { SnackbarHost(snackbarHostState) }
    ) { padding ->
        Button(
            modifier = Modifier.padding(padding),
            onClick = {
                scope.launch {
                    val result = snackbarHostState.showSnackbar(
                        message = "Элемент удалён",
                        actionLabel = "Отмена"
                    )
                    if (result == SnackbarResult.ActionPerformed) {
                        /* отменить удаление */
                    }
                }
            }
        ) {
            Text("Удалить")
        }
    }
}

Жизненный цикл scope

Scope отменяется при уходе composable из дерева. Если тот же composable перерисовывается (рекомпозиция), scope не пересоздаётся — remember сохраняет его между рекомпозициями. Все запущенные корутины продолжают работать до завершения или отмены scope.

Dispatcher по умолчанию

По умолчанию используется Dispatchers.Main.immediate. Для фоновой работы используйте withContext(Dispatchers.IO) внутри корутины, а не передавайте другой dispatcher в rememberCoroutineScope.

scope.launch {
    withContext(Dispatchers.IO) {
        heavyRepository.load()   // фоновый поток
    }
    // результат применяется на Main
    state = result
}

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

  • Использование GlobalScope.launch вместо rememberCoroutineScope — корутина продолжает жить после уничтожения экрана.
  • Множественные клики запускают несколько параллельных корутин — добавляйте debounce или флаг isLoading.
  • Изменение State из корутины не в Main-потоке без withContext(Dispatchers.Main) бросает исключение в старых версиях Compose.
  • Попытка вызвать suspend-функцию напрямую в onClick — это не suspend-контекст, код не скомпилируется.
  • Хранение scope в ViewModel — он привязан к composable, не к ViewModel; используйте viewModelScope для работы в ViewModel.
  • Передача scope в дочерний composable нарушает инкапсуляцию — лучше передавать лямбды () -> Unit.
  • Вызов rememberCoroutineScope вне composable-функции вызовет ошибку времени выполнения.

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

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

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

  • Объяснять «rememberCoroutineScope» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Запуск долгой domain-работы из этого scope может отмениться при уходе composable и потерять бизнес-операцию.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «rememberCoroutineScope» своими словами и связывает ее с кодом.
  • Называет механизм: Он подходит для реакций на события пользователя, например scroll или snackbar, когда LaunchedEffect не выражает событие.
  • Видит production-последствие: Запуск долгой domain-работы из этого scope может отмениться при уходе composable и потерять бизнес-операцию.

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

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

Источники

  • https://developer.android.com/develop/ui/compose/side-effects
←Предыдущий вопросВ чём разница между stateful и stateless composable?Следующий вопрос→Как обрабатывать темы и стили в Jetpack Compose с помощью Material3?

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

Jetpack Composeremember-coroutine-scope-reasoningui-state