Эйч
Эйч
  • Все менторы
Задачи/Android-разработчик/Ошибки в экране со списком контактов на Jetpack Compose

Ошибки в экране со списком контактов на Jetpack Compose

Условие задачи

Есть экран со списком контактов. На контакт можно нажать и он будет выведен. При скролле появляется кнопка, по нажатию которой можно вернуться к началу списка. Есть кнопка для смены фона контакта. Требуется найти проблемы в коде и объяснить почему так не нужно делать

Kotlin@Composable
fun ContactsScreen() {
    val viewModel = remember { ViewModel() }
    val contacts by viewModel.contacts.collectAsState()
    val selectedContact by viewModel.selectedContact.collectAsState()

    ContactsContent(
        contacts = contacts,
        selectedContact = selectedContact,
        onClick = { viewModel.onContactClicked(it) }
    )
}

@Composable
fun ContactsContent(
    contacts: List<String>,
    selectedContact: String?,
    onClick: (String) -> Unit
) {
    Column {
        if (selectedContact != null) {
            Text(selectedContact, style = Typography().h4)
        }
        Contacts(contacts = contacts, onClick = onClick)
    }
}

@Composable
private fun Contacts(
    contacts: List<String>,
    onClick: (String) -> Unit
) {
    val sortedContacts = contacts.sorted()
    val scope = CoroutineScope(Dispatchers.Main)
    val scrollState = rememberScrollState()
    val background = remember { mutableStateOf(Color.Transparent) }

    Column(Modifier.verticalScroll(scrollState)) {
        Button(
            onClick = {
                background.value = Color(
                    red = (0x00..0xFF).random(),
                    green = (0x00..0xFF).random(),
                    blue = (0x00..0xFF).random()
                )
            }
        ) {
            Text("Colorize")
        }

        sortedContacts.forEach {
            Contact(
                contact = it,
                background = background.value,
                onClick = onClick
            )
        }

        if (scrollState.value > 0) {
            Button(
                onClick = {
                    scope.launch {
                        scrollState.scrollTo(0)
                    }
                },
                modifier = Modifier
                    .offset(y = (-32).dp)
                    .requiredSize(64.dp)
            ) {
                Icon(
                    imageVector = Icons.Default.KeyboardArrowUp,
                    contentDescription = null
                )
            }
        }
    }
}

@Composable
private fun Contact(
    contact: String,
    background: Color,
    onClick: (String) -> Unit
) {
    Text(
        contact,
        Modifier
            .fillMaxWidth()
            .background(background)
            .padding(16.dp)
            .clickable { onClick(contact) }
    )
}

Профессия

Android-разработчик

Сопроводим до оффера

Умножим шансы на каждом этапе поиска и поможем получить выгодный оффер

Узнать больше

Сервис развития карьеры

Контактыteam@h.careers@hcareers
TelegramVKYouTubeLinkedIn
Профессии
Компания
С чем помогаемОтзывыВопросы и ответыСертификатыВебинарыСтать ментором

Платформа принадлежит ООО "Эйч Карьера"
ИНН 9710095807 ОГРН 1227700077340
Адрес: 127006, город Москва, Старопименовский пер, д. 18 стр. 2, помещ./ком./этаж I/19/2

Copyright © 2020-2025 Сервис развития карьеры Эйч. Все права защищены.

Политика конфиденциальностиПользовательское соглашениеОферта