Kotlin: Различия между stringResource() и getString()

При разработке приложений на Android с использованием Jetpack Compose и стандартных подходов на основе Activity/Fragments вы можете столкнуться с двумя разными способами получения строковых ресурсов: функцией stringResource() и методом getString(). Оба способа служат схожей цели — получают строку из ресурсов проекта, однако имеют разное назначение и области применения.

Функционал и различия



stringResource()
  • Назначение: Используется в рамках композиции Composable-функций Jetpack Compose.
  • Где применяется: Только внутри функций с аннотацией @Composable.
  • Формат: Выглядит как простая функция, принимающая ID ресурса: stringResource(R.string.your_string_id).
  • Импорт: Необходимо подключить следующий импорт:
    import androidx.compose.ui.res.stringResource

Пример использования:
@Composable
fun MyScreen() {
    Text(text = stringResource(R.string.welcome_message))
}

getString()
  • Назначение: Применяется вне контекста Compose-композиций, например, в обычных Activity, Fragment
...

Kotlin: onSuccess и onError

В Kotlin (особенно при работе с корутинами и асинхронными операциями) часто встречаются конструкции onSuccess и onError. Они служат для обработки результатов асинхронных операций — как успешных, так и ошибочных.

Что это такое?


Это лямбда‑функции (callback-обработчики), которые:
  • onSuccess — вызывается при успешном завершении операции;
  • onError — вызывается при возникновении ошибки.

Они позволяют отделить логику обработки результата от самого выполнения операции.

Где применяются


Чаще всего встречаются в:
  • сетевых запросах (Retrofit, Ktor);
  • работе с БД (Room, SQLDelight);
  • корутинах (async, await);
  • RxJava/RxKotlin;
  • библиотеках для работы с файлами/IO.

Базовый синтаксис
someAsyncOperation(
    onSuccess = { result ->
        // Обработка успешного результата
    },
    onError = { exception ->
        // Обработка ошибки
    }
)

Практические примеры



Сетевой запрос (Retrofit)
apiService.getUser(userId)
    .enqueue(object : Callback<User> {
        override fun
...

Kotlin: Аннотация @Composable

Аннотация @Composable в Jetpack Compose используется для обозначения функций, которые могут создавать и обновлять пользовательский интерфейс. Эти функции называются композиционными функциями и могут содержать код, который описывает, как должен выглядеть пользовательский интерфейс.

Когда использовать @Composable



1. Создание пользовательского интерфейса
Если функция должна выводить что-то на экран, она должна быть помечена аннотацией: @Composable:
@Composable
fun Greeting(name: String) {
    Text(text = "Hello, $name!")
}

2. Вложенные композиционные функции
Если функция вызывает другие композиционные функции, она также должна быть помечена аннотацией @Composable:
@Composable
fun Content() {
    Greeting(name = "Kotlin")
}

3. Функции, которые изменяют состояние
Если функция изменяет состояние (например, с помощью remember), она должна быть помечена аннотацией @Composable:
@Composable
fun Counter() {
    var count by remember {
...

Kotlin: Конфигурация BuildConfig недоступна в файлах приложения

Врера, потребовалось воспользоваться BuildConfig.VERSION_NAME для получения версии приложения, но она отказалась быть определённой.

Чтобы решить, вместо этого:
                val versionApp = BuildConfig.VERSION_NAME

Я использовал это:
                val versionApp = try {
                    context.packageManager.getPackageInfo(context.packageName, 0).versionName
                } catch (_: Exception) {
                    null
                }

Это безотказный вариант. Сегодня я попробовал вставить:
                val versionApp = BuildConfig.VERSION_NAME

И всё было определенно.

Возможно потребуется импорт:
import net.danfa.rush.BuildConfig


...

Kotlin: Корутины (coroutines)

Корутины (coroutines) — это механизм в Kotlin, который позволяет писать асинхронный и неблокирующий код в стиле синхронного программирования. Корутины упрощают работу с асинхронными задачами, такими как сетевые запросы, работа с базами данных и другие длительные операции, без необходимости использования сложных конструкций, таких как коллбэки или потоки.

Основные особенности корутин



Асинхронность: Корутины позволяют выполнять длительные операции асинхронно, не блокируя основной поток.

Неблокирующий код: Корутины могут приостанавливаться и возобновляться без блокировки потока, что делает их эффективными для выполнения длительных операций.

Легкость в использовании: Корутины позволяют писать асинхронный код в стиле синхронного программирования, что упрощает чтение и понимание кода.

Пример использования корутин
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")

    // Запуск корутины
    launch {
        delay(2000) // Приостановка корутины на 2
...