Ошибки при написании Android приложения

Type 'MutableState<String>' has no method 'setValue(Nothing?, KMutableProperty0<*>, String)', so it cannot serve as a delegate for var (read-write property)


Эта ошибка возникает, когда вы пытаетесь использовать mutableStateOf() для делегирования свойства через by, но не подключили нужный импорт.

Причина


Для работы синтаксиса by mutableStateOf() требуется импорт:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue

Без этих импортов компилятор не видит методы getValue/setValue, необходимые для делегирования.

Unresolved reference 'Done'


Ошибка Unresolved reference 'Done' возникает, потому что компилятор не находит константу ImeAction.Done. Это значит — не подключены нужные импорты.

Как исправить


Добавьте в начало файла следующие импорты:
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardActions

Package name 'xxx.xxx.xxx.XXxx' part should not start with an uppercase letter


Это предупреждение Lint (анализатора кода Android) о нарушении стандартов именования пакетов в Java/Kotlin.

Согласно официальным соглашениям (Java/Kotlin):
  • Имена пакетов должны состоять только из строчных букв и цифр.
  • Использование заглавных букв (особенно в начале частей имени) не рекомендуется.

Если вы видите у себя это предупреждение, значит название вашего пакета содержит заглавные буквы (Одну или несколько). Изменив заглавные буквы на "маленькие", ошибка исчезнет.

Несоответствие типов Long и null


В коде ниже: Навигация открывающая экран чата с двумя параметрами. Параметр userId или chatId может быть null, но так как оба эти параметра имеют тип Long, то null они быть не должны, в любом случае.
                    composable( // Private and Public Chat
                        route = "chat/{userId}/{chatId}",
                        arguments = listOf(
                            navArgument("userId") {
                                type     = NavType.LongType
                                nullable = true
                            },
                            navArgument("chatId") {
                                type     = NavType.LongType
                                nullable = true
                            }
                        )
                    ) { entry ->
                        val userId: Long? = entry.arguments?.getLong("userId")
                        val chatId: Long? = entry.arguments?.getLong("chatId")
                        Chat(navController, chatId, userId)
                    } // End: Private and Public Chat

Я решил проблему (Возможно костыль): Преобразовать параметр в String, затем в Long, если не null, и в null, если не Long:
                    composable( // Private and Public Chat
                        route = "chat/{userId}/{chatId}",
                        arguments = listOf(
                            navArgument("userId") {
                                type     = NavType.StringType
                                nullable = true
                            },
                            navArgument("chatId") {
                                type     = NavType.StringType
                                nullable = true
                            }
                        )
                    ) { entry ->
                        // userId | chatId
                        // Type conversion: from Long to String, then back to Long or null
                        val userId: Long? = entry.arguments?.getString("userId")?.toLongOrNull()
                        val chatId: Long? = entry.arguments?.getString("chatId")?.toLongOrNull()
                        Chat(navController, chatId, userId)
                    } // End: Private and Public Chat