Ошибки в экране со списком контактов на 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) }
)
}