Android KTX Часть Android Jetpack .

Android KTX — это набор расширений Kotlin, входящих в состав Android Jetpack и других библиотек Android. Расширения KTX предоставляют краткий, идиоматический Kotlin для Jetpack, платформы Android и других API. Для этого эти расширения используют несколько функций языка Kotlin, в том числе следующие:

  • Функции расширения
  • Свойства расширения
  • Лямбды
  • Именованные параметры
  • Значения параметров по умолчанию
  • Сопрограммы

Например, при работе с SharedPreferences вам необходимо создать редактор , прежде чем вы сможете вносить изменения в данные настроек. Вы также должны применить или зафиксировать эти изменения после завершения редактирования, как показано в следующем примере:

sharedPreferences
        .edit()  // create an Editor
        .putBoolean("key", value)
        .apply() // write to disk asynchronously

Лямбды Kotlin идеально подходят для этого варианта использования. Они позволяют использовать более лаконичный подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполняться, а затем позволяя API SharedPreferences применять изменения атомарно.

Вот пример одной из функций Android KTX Core, SharedPreferences.edit , которая добавляет функцию редактирования в SharedPreferences . Эта функция принимает необязательный boolean флаг в качестве первого аргумента, который указывает, следует ли зафиксировать или применить изменения. Он также получает действие для выполнения в редакторе SharedPreferences в форме лямбды.

// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
//         commit: Boolean = false,
//         action: SharedPreferences.Editor.() -> Unit)

// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }

// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }

Вызывающий может выбрать, зафиксировать или применить изменения. Лямбда- action само по себе является анонимной функцией расширения SharedPreferences.Editor , которая возвращает Unit , как указано в его сигнатуре. Вот почему внутри блока вы можете выполнять работу непосредственно над SharedPreferences.Editor .

Наконец, подпись SharedPreferences.edit() содержит ключевое слово inline . Это ключевое слово сообщает компилятору Kotlin, что он должен копировать и вставлять (или вставлять ) скомпилированный байт-код для функции каждый раз, когда функция используется. Это позволяет избежать накладных расходов на создание экземпляра нового класса для каждого action при каждом вызове этой функции.

Этот шаблон передачи кода с использованием лямбда-выражений, применения разумных значений по умолчанию, которые можно переопределить, и добавления такого поведения к существующим API с использованием inline функций расширения является типичным для улучшений, предоставляемых библиотекой Android KTX.

Используйте Android KTX в своем проекте

Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл build.gradle вашего проекта:

классный

repositories {
    google()
}

Котлин

repositories {
    google()
}

Модули AndroidX

Android KTX организован в виде модулей, каждый из которых содержит один или несколько пакетов.

Вы должны включить зависимость для каждого артефакта модуля в файл build.gradle вашего приложения. Не забудьте добавить номер версии к артефакту. Номера последних версий можно найти в соответствующем разделе каждого артефакта в этой теме.

Android KTX содержит один основной модуль , который предоставляет расширения Kotlin для общих API-интерфейсов платформы, а также несколько расширений для конкретной предметной области.

За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle . Например, вы можете заменить зависимость androidx.fragment:fragment на androidx.fragment:fragment-ktx . Этот синтаксис помогает лучше управлять версиями и не добавляет дополнительных требований к объявлению зависимостей.

Ядро КТХ

Модуль Core KTX предоставляет расширения для распространенных библиотек, которые являются частью платформы Android. Эти библиотеки не имеют зависимостей на основе Java, которые необходимо добавить в build.gradle .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.core:core-ktx:1.13.1"
}

Котлин

dependencies {
    implementation("androidx.core:core-ktx:1.13.1")
}

Вот список пакетов, содержащихся в модуле Core KTX:

Коллекция КТХ

Расширения Collection содержат служебные функции для работы с библиотеками коллекций Android, эффективно использующими память, включая ArrayMap , LongSparseArray , LruCache и другие.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.collection:collection-ktx:1.4.4"
}

Котлин

dependencies {
    implementation("androidx.collection:collection-ktx:1.4.4")
}

Расширения коллекций используют преимущества перегрузки операторов Kotlin для упрощения таких вещей, как объединение коллекций, как показано в следующем примере:

// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)

// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8

Фрагмент КТХ

Модуль Fragment KTX предоставляет ряд расширений для упрощения API фрагмента.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.8.3"
}

Котлин

dependencies {
    implementation("androidx.fragment:fragment-ktx:1.8.3")
}

С помощью модуля Fragment KTX вы можете упростить транзакции фрагментов с помощью лямбда-выражений, например:

fragmentManager().commit {
   addToBackStack("...")
   setCustomAnimations(
           R.anim.enter_anim,
           R.anim.exit_anim)
   add(fragment, "...")
}

Вы также можете выполнить привязку к ViewModel в одной строке, используя делегаты свойств viewModels и activityViewModels :

// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()

// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

Жизненный цикл КТХ

Lifecycle KTX определяет LifecycleScope для каждого объекта Lifecycle . Любая сопрограмма, запущенная в этой области, отменяется при уничтожении Lifecycle . Вы можете получить доступ к CoroutineScope Lifecycle , используя свойства lifecycle.coroutineScope или lifecycleOwner.lifecycleScope .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6")
}

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

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}

LiveData КТХ

При использовании LiveData вам может потребоваться асинхронное вычисление значений. Например, вы можете захотеть получить настройки пользователя и передать их в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию построения liveData , которая вызывает функцию suspend и обрабатывает результат как объект LiveData .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6")
}

В следующем примере loadUser() — это функция приостановки, объявленная в другом месте. Вы можете использовать функцию компоновщика liveData для асинхронного вызова loadUser() , а затем использовать emit() для выдачи результата:

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

Дополнительную информацию об использовании сопрограмм с LiveData см. в разделе Использование сопрограмм Kotlin с компонентами архитектуры .

Каждый компонент библиотеки навигации имеет свою собственную версию KTX, которая адаптирует API, чтобы сделать его более кратким и идиоматическим Kotlin.

Чтобы включить эти модули, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.8.1"
    implementation "androidx.navigation:navigation-fragment-ktx:2.8.1"
    implementation "androidx.navigation:navigation-ui-ktx:2.8.1"
}

Котлин

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.8.1")
    implementation("androidx.navigation:navigation-fragment-ktx:2.8.1")
    implementation("androidx.navigation:navigation-ui-ktx:2.8.1")
}

Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перехода к местам назначения, как показано в следующем примере:

class MyDestination : Fragment() {

    // Type-safe arguments are accessed from the bundle.
    val args by navArgs<MyDestinationArgs>()

    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.next)
            .setOnClickListener {
                // Fragment extension added to retrieve a NavController from
                // any destination.
                findNavController().navigate(R.id.action_to_next_destination)
            }
     }
     ...

}

Палитра КТХ

Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.palette:palette-ktx:1.0.0"
}

Котлин

dependencies {
    implementation("androidx.palette:palette-ktx:1.0.0")
}

Например, при работе с экземпляром Palette вы можете получить selected образец для заданной target с помощью оператора get ( [ ] ):

val palette = Palette.from(bitmap).generate()
val swatch = palette[target]

Реактивные потоки KTX

Модуль Reactive Streams KTX позволяет создавать наблюдаемый поток LiveData от издателя ReactiveStreams .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6")
}

В качестве примера предположим, что база данных имеет небольшой список пользователей. В своем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в своем пользовательском интерфейсе. Для этого вы можете использовать RxJava . Компонент Room Jetpack может получить список пользователей в виде Flowable . В этом сценарии вам также необходимо управлять подпиской издателя Rx на протяжении всего срока действия вашего фрагмента или действия.

Однако с LiveDataReactiveStreams вы можете воспользоваться преимуществами RxJava и его богатым набором операторов и возможностей планирования работы, одновременно работая с простотой LiveData , как показано в следующем примере:

val fun getUsersLiveData() : LiveData<List<User>> {
    val users: Flowable<List<User>> = dao.findUsers()
    return LiveDataReactiveStreams.fromPublisher(users)
}

Комната КТХ

Расширения комнат добавляют поддержку сопрограмм для транзакций базы данных.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.room:room-ktx:2.6.1"
}

Котлин

dependencies {
    implementation("androidx.room:room-ktx:2.6.1")
}

Вот несколько примеров, когда Room теперь использует сопрограммы. В первом примере используется функция suspend для возврата списка объектов User , а во втором — Flow Kotlin для асинхронного возврата списка User . Обратите внимание, что при использовании Flow вы также получаете уведомления о любых изменениях в запрашиваемых таблицах.

@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>

@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>

SQLite KTX

Расширения SQLite заключают код, связанный с SQL, в транзакции, устраняя большое количество шаблонного кода.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.sqlite:sqlite-ktx:2.4.0"
}

Котлин

dependencies {
    implementation("androidx.sqlite:sqlite-ktx:2.4.0")
}

Вот пример использования расширения transaction для выполнения транзакции базы данных:

db.transaction {
    // insert data
}

Просмотр модели KTX

Библиотека ViewModel KTX предоставляет функцию viewModelScope() , которая упрощает запуск сопрограмм из вашей ViewModel . CoroutineScope привязан к Dispatchers.Main и автоматически отменяется при очистке ViewModel . Вы можете использовать viewModelScope() вместо создания новой области для каждой ViewModel .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6")
}

Например, следующая функция viewModelScope() запускает сопрограмму, которая выполняет сетевой запрос в фоновом потоке. Библиотека выполняет всю настройку и очистку соответствующей области:

class MainViewModel : ViewModel() {
    // Make a network request without blocking the UI thread
    private fun makeNetworkRequest() {
        // launch a coroutine in viewModelScope
        viewModelScope.launch  {
            remoteApi.slowFetch()
            ...
        }
    }

    // No need to override onCleared()
}

Менеджер работ КТХ

WorkManager KTX обеспечивает первоклассную поддержку сопрограмм.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.1"
}

Котлин

dependencies {
    implementation("androidx.work:work-runtime-ktx:2.9.1")
}

Вместо расширения Worker теперь вы можете расширить CoroutineWorker , у которого немного другой API. Например, если вы хотите создать простой CoroutineWorker для выполнения некоторых сетевых операций, вы можете сделать следующее:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
        : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result = coroutineScope {
        val jobs = (0 until 100).map {
            async {
                downloadSynchronously("https://www.google.com")
            }
        }

        // awaitAll will throw an exception if a download fails, which
        // CoroutineWorker will treat as a failure
        jobs.awaitAll()
        Result.success()
    }
}

Дополнительные сведения об использовании CoroutineWorker см. в разделе Потоки в CoroutineWorker .

WorkManager KTX также добавляет функции расширения в Operations и ListenableFutures для приостановки текущей сопрограммы.

Вот пример, который приостанавливает Operation , возвращаемую функцией enqueue() :

// Inside of a coroutine...

// Run async operation and suspend until completed.
WorkManager.getInstance()
        .beginWith(longWorkRequest)
        .enqueue().await()

// Resume after work completes...

Другие модули KTX

Вы также можете включить дополнительные модули KTX, существующие за пределами AndroidX.

Огневая база КТХ

Некоторые SDK Firebase для Android содержат библиотеки расширений Kotlin, которые позволяют вам писать идиоматический код Kotlin при использовании Firebase в вашем приложении. Для получения дополнительной информации см. следующие темы:

Платформа Google Карт KTX

Для Android SDK платформы Google Maps доступны расширения KTX, которые позволяют вам использовать преимущества некоторых функций языка Kotlin, таких как функции расширения, именованные параметры и аргументы по умолчанию, объявления деструктуризации и сопрограммы. Для получения дополнительной информации см. следующие темы:

Играть в ядро ​​KTX

В Play Core KTX добавлена ​​поддержка сопрограмм Kotlin для одноразовых запросов и Flow для мониторинга обновлений статуса путем добавления функций расширения к SplitInstallManager и AppUpdateManager в библиотеке Play Core.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "com.google.android.play:core-ktx:1.8.1"
}

Котлин

dependencies {
    implementation("com.google.android.play:core-ktx:1.8.1")
}

Вот пример Flow мониторинга состояния:

// Inside of a coroutine...

// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
    when (updateResult) {
        is AppUpdateResult.Available -> TODO()
        is AppUpdateResult.InProgress -> TODO()
        is AppUpdateResult.Downloaded -> TODO()
        AppUpdateResult.NotAvailable -> TODO()
    }
}

Дополнительная информация

Чтобы узнать больше об Android KTX, посмотрите видео DevBytes .

Чтобы сообщить о проблеме или предложить функцию, используйте систему отслеживания проблем Android KTX .

,

Android KTX Часть Android Jetpack .

Android KTX — это набор расширений Kotlin, входящих в состав Android Jetpack и других библиотек Android. Расширения KTX предоставляют краткий, идиоматический Kotlin для Jetpack, платформы Android и других API. Для этого эти расширения используют несколько функций языка Kotlin, в том числе следующие:

  • Функции расширения
  • Свойства расширения
  • Лямбды
  • Именованные параметры
  • Значения параметров по умолчанию
  • Сопрограммы

Например, при работе с SharedPreferences вам необходимо создать редактор , прежде чем вы сможете вносить изменения в данные настроек. Вы также должны применить или зафиксировать эти изменения после завершения редактирования, как показано в следующем примере:

sharedPreferences
        .edit()  // create an Editor
        .putBoolean("key", value)
        .apply() // write to disk asynchronously

Лямбды Kotlin идеально подходят для этого варианта использования. Они позволяют использовать более лаконичный подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполняться, а затем позволяя API SharedPreferences применять изменения атомарно.

Вот пример одной из функций Android KTX Core, SharedPreferences.edit , которая добавляет функцию редактирования в SharedPreferences . Эта функция принимает необязательный boolean флаг в качестве первого аргумента, который указывает, следует ли зафиксировать или применить изменения. Он также получает действие для выполнения в редакторе SharedPreferences в форме лямбды.

// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
//         commit: Boolean = false,
//         action: SharedPreferences.Editor.() -> Unit)

// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }

// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }

Вызывающий может выбрать, зафиксировать или применить изменения. Лямбда- action само по себе является анонимной функцией расширения SharedPreferences.Editor , которая возвращает Unit , как указано в его сигнатуре. Вот почему внутри блока вы можете выполнять работу непосредственно над SharedPreferences.Editor .

Наконец, подпись SharedPreferences.edit() содержит ключевое слово inline . Это ключевое слово сообщает компилятору Kotlin, что он должен копировать и вставлять (или вставлять ) скомпилированный байт-код для функции каждый раз, когда функция используется. Это позволяет избежать накладных расходов на создание экземпляра нового класса для каждого action при каждом вызове этой функции.

Этот шаблон передачи кода с использованием лямбда-выражений, применения разумных значений по умолчанию, которые можно переопределить, и добавления этого поведения к существующим API с использованием inline функций расширения является типичным для улучшений, предоставляемых библиотекой Android KTX.

Используйте Android KTX в своем проекте

Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл build.gradle вашего проекта:

классный

repositories {
    google()
}

Котлин

repositories {
    google()
}

Модули AndroidX

Android KTX организован в модули, каждый из которых содержит один или несколько пакетов.

Вы должны включить зависимость для каждого артефакта модуля в файл build.gradle вашего приложения. Не забудьте добавить номер версии к артефакту. Номера последних версий можно найти в соответствующем разделе каждого артефакта в этой теме.

Android KTX содержит один основной модуль , который предоставляет расширения Kotlin для общих API-интерфейсов платформы, а также несколько расширений для конкретной предметной области.

За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle . Например, вы можете заменить зависимость androidx.fragment:fragment на androidx.fragment:fragment-ktx . Этот синтаксис помогает лучше управлять версиями и не добавляет дополнительных требований к объявлению зависимостей.

Ядро КТХ

Модуль Core KTX предоставляет расширения для распространенных библиотек, которые являются частью платформы Android. Эти библиотеки не имеют зависимостей на основе Java, которые необходимо добавить в build.gradle .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.core:core-ktx:1.13.1"
}

Котлин

dependencies {
    implementation("androidx.core:core-ktx:1.13.1")
}

Вот список пакетов, содержащихся в модуле Core KTX:

Коллекция КТХ

Расширения Collection содержат служебные функции для работы с библиотеками коллекций Android, эффективно использующими память, включая ArrayMap , LongSparseArray , LruCache и другие.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.collection:collection-ktx:1.4.4"
}

Котлин

dependencies {
    implementation("androidx.collection:collection-ktx:1.4.4")
}

Расширения коллекций используют преимущества перегрузки операторов Kotlin для упрощения таких вещей, как объединение коллекций, как показано в следующем примере:

// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)

// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8

Фрагмент КТХ

Модуль Fragment KTX предоставляет ряд расширений для упрощения API фрагмента.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.8.3"
}

Котлин

dependencies {
    implementation("androidx.fragment:fragment-ktx:1.8.3")
}

С помощью модуля Fragment KTX вы можете упростить транзакции фрагментов с помощью лямбда-выражений, например:

fragmentManager().commit {
   addToBackStack("...")
   setCustomAnimations(
           R.anim.enter_anim,
           R.anim.exit_anim)
   add(fragment, "...")
}

Вы также можете выполнить привязку к ViewModel в одной строке, используя делегаты свойств viewModels и activityViewModels :

// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()

// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

Жизненный цикл КТХ

Lifecycle KTX определяет LifecycleScope для каждого объекта Lifecycle . Любая сопрограмма, запущенная в этой области, отменяется при уничтожении Lifecycle . Вы можете получить доступ к CoroutineScope Lifecycle , используя свойства lifecycle.coroutineScope или lifecycleOwner.lifecycleScope .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6")
}

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

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}

LiveData КТХ

При использовании LiveData вам может потребоваться асинхронное вычисление значений. Например, вы можете захотеть получить настройки пользователя и передать их в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию построения liveData , которая вызывает функцию suspend и обрабатывает результат как объект LiveData .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6")
}

В следующем примере loadUser() — это функция приостановки, объявленная в другом месте. Вы можете использовать функцию компоновщика liveData для асинхронного вызова loadUser() , а затем использовать emit() для выдачи результата:

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

Дополнительную информацию об использовании сопрограмм с LiveData см. в разделе Использование сопрограмм Kotlin с компонентами архитектуры .

Каждый компонент библиотеки навигации имеет свою собственную версию KTX, которая адаптирует API, чтобы сделать его более кратким и идиоматическим Kotlin.

Чтобы включить эти модули, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.8.1"
    implementation "androidx.navigation:navigation-fragment-ktx:2.8.1"
    implementation "androidx.navigation:navigation-ui-ktx:2.8.1"
}

Котлин

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.8.1")
    implementation("androidx.navigation:navigation-fragment-ktx:2.8.1")
    implementation("androidx.navigation:navigation-ui-ktx:2.8.1")
}

Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перехода к местам назначения, как показано в следующем примере:

class MyDestination : Fragment() {

    // Type-safe arguments are accessed from the bundle.
    val args by navArgs<MyDestinationArgs>()

    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.next)
            .setOnClickListener {
                // Fragment extension added to retrieve a NavController from
                // any destination.
                findNavController().navigate(R.id.action_to_next_destination)
            }
     }
     ...

}

Палитра КТХ

Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.palette:palette-ktx:1.0.0"
}

Котлин

dependencies {
    implementation("androidx.palette:palette-ktx:1.0.0")
}

Например, при работе с экземпляром Palette вы можете получить selected образец для заданной target с помощью оператора get ( [ ] ):

val palette = Palette.from(bitmap).generate()
val swatch = palette[target]

Реактивные потоки KTX

Модуль Reactive Streams KTX позволяет создавать наблюдаемый поток LiveData от издателя ReactiveStreams .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6")
}

В качестве примера предположим, что база данных имеет небольшой список пользователей. В своем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в своем пользовательском интерфейсе. Для этого вы можете использовать RxJava . Компонент Room Jetpack может получить список пользователей в виде Flowable . В этом сценарии вам также необходимо управлять подпиской издателя Rx на протяжении всего срока действия вашего фрагмента или действия.

Однако с помощью LiveDataReactiveStreams вы можете воспользоваться преимуществами RxJava и его богатым набором операторов и возможностей планирования работы, одновременно работая с простотой LiveData , как показано в следующем примере:

val fun getUsersLiveData() : LiveData<List<User>> {
    val users: Flowable<List<User>> = dao.findUsers()
    return LiveDataReactiveStreams.fromPublisher(users)
}

Комната КТХ

Расширения комнат добавляют поддержку сопрограмм для транзакций базы данных.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.room:room-ktx:2.6.1"
}

Котлин

dependencies {
    implementation("androidx.room:room-ktx:2.6.1")
}

Вот несколько примеров, когда Room теперь использует сопрограммы. В первом примере используется функция suspend для возврата списка объектов User , а во втором — Flow Kotlin для асинхронного возврата списка User . Обратите внимание, что при использовании Flow вы также получаете уведомления о любых изменениях в запрашиваемых таблицах.

@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>

@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>

SQLite KTX

Расширения SQLite заключают код, связанный с SQL, в транзакции, устраняя большое количество шаблонного кода.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.sqlite:sqlite-ktx:2.4.0"
}

Котлин

dependencies {
    implementation("androidx.sqlite:sqlite-ktx:2.4.0")
}

Вот пример использования расширения transaction для выполнения транзакции базы данных:

db.transaction {
    // insert data
}

Просмотр модели KTX

Библиотека ViewModel KTX предоставляет функцию viewModelScope() , которая упрощает запуск сопрограмм из вашей ViewModel . CoroutineScope привязан к Dispatchers.Main и автоматически отменяется при очистке ViewModel . Вы можете использовать viewModelScope() вместо создания новой области для каждой ViewModel .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6")
}

Например, следующая функция viewModelScope() запускает сопрограмму, которая выполняет сетевой запрос в фоновом потоке. Библиотека выполняет всю настройку и очистку соответствующей области:

class MainViewModel : ViewModel() {
    // Make a network request without blocking the UI thread
    private fun makeNetworkRequest() {
        // launch a coroutine in viewModelScope
        viewModelScope.launch  {
            remoteApi.slowFetch()
            ...
        }
    }

    // No need to override onCleared()
}

Менеджер работ КТХ

WorkManager KTX обеспечивает первоклассную поддержку сопрограмм.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.1"
}

Котлин

dependencies {
    implementation("androidx.work:work-runtime-ktx:2.9.1")
}

Вместо расширения Worker теперь вы можете расширить CoroutineWorker , у которого немного другой API. Например, если вы хотите создать простой CoroutineWorker для выполнения некоторых сетевых операций, вы можете сделать следующее:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
        : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result = coroutineScope {
        val jobs = (0 until 100).map {
            async {
                downloadSynchronously("https://www.google.com")
            }
        }

        // awaitAll will throw an exception if a download fails, which
        // CoroutineWorker will treat as a failure
        jobs.awaitAll()
        Result.success()
    }
}

Дополнительные сведения об использовании CoroutineWorker см. в разделе Потоки в CoroutineWorker .

WorkManager KTX также добавляет функции расширения в Operations и ListenableFutures для приостановки текущей сопрограммы.

Вот пример, который приостанавливает Operation , возвращаемую функцией enqueue() :

// Inside of a coroutine...

// Run async operation and suspend until completed.
WorkManager.getInstance()
        .beginWith(longWorkRequest)
        .enqueue().await()

// Resume after work completes...

Другие модули KTX

Вы также можете включить дополнительные модули KTX, существующие за пределами AndroidX.

Огневая база КТХ

Некоторые SDK Firebase для Android содержат библиотеки расширений Kotlin, которые позволяют вам писать идиоматический код Kotlin при использовании Firebase в вашем приложении. Для получения дополнительной информации см. следующие темы:

Платформа Google Карт KTX

Для Android SDK платформы Google Maps доступны расширения KTX, которые позволяют вам использовать преимущества некоторых функций языка Kotlin, таких как функции расширения, именованные параметры и аргументы по умолчанию, объявления деструктуризации и сопрограммы. Для получения дополнительной информации см. следующие темы:

Играть в ядро ​​KTX

В Play Core KTX добавлена ​​поддержка сопрограмм Kotlin для одноразовых запросов и Flow для мониторинга обновлений статуса путем добавления функций расширения к SplitInstallManager и AppUpdateManager в библиотеке Play Core.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "com.google.android.play:core-ktx:1.8.1"
}

Котлин

dependencies {
    implementation("com.google.android.play:core-ktx:1.8.1")
}

Вот пример Flow мониторинга состояния:

// Inside of a coroutine...

// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
    when (updateResult) {
        is AppUpdateResult.Available -> TODO()
        is AppUpdateResult.InProgress -> TODO()
        is AppUpdateResult.Downloaded -> TODO()
        AppUpdateResult.NotAvailable -> TODO()
    }
}

Дополнительная информация

Чтобы узнать больше об Android KTX, посмотрите видео DevBytes .

Чтобы сообщить о проблеме или предложить функцию, используйте систему отслеживания проблем Android KTX .

,

Android KTX Часть Android Jetpack .

Android KTX — это набор расширений Kotlin, входящих в состав Android Jetpack и других библиотек Android. Расширения KTX предоставляют краткий, идиоматический Kotlin для Jetpack, платформы Android и других API. Для этого эти расширения используют несколько функций языка Kotlin, в том числе следующие:

  • Функции расширения
  • Свойства расширения
  • Лямбды
  • Именованные параметры
  • Значения параметров по умолчанию
  • Сопрограммы

Например, при работе с SharedPreferences вам необходимо создать редактор , прежде чем вы сможете вносить изменения в данные настроек. Вы также должны применить или зафиксировать эти изменения после завершения редактирования, как показано в следующем примере:

sharedPreferences
        .edit()  // create an Editor
        .putBoolean("key", value)
        .apply() // write to disk asynchronously

Лямбды Kotlin идеально подходят для этого варианта использования. Они позволяют использовать более лаконичный подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполняться, а затем позволяя API SharedPreferences применять изменения атомарно.

Вот пример одной из функций Android KTX Core, SharedPreferences.edit , которая добавляет функцию редактирования в SharedPreferences . Эта функция принимает необязательный boolean флаг в качестве первого аргумента, который указывает, следует ли зафиксировать или применить изменения. Он также получает действие для выполнения в редакторе SharedPreferences в форме лямбды.

// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
//         commit: Boolean = false,
//         action: SharedPreferences.Editor.() -> Unit)

// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }

// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }

Вызывающий может выбрать, зафиксировать или применить изменения. Лямбда- action само по себе является анонимной функцией расширения SharedPreferences.Editor , которая возвращает Unit , как указано в его сигнатуре. Вот почему внутри блока вы можете выполнять работу непосредственно над SharedPreferences.Editor .

Наконец, подпись SharedPreferences.edit() содержит ключевое слово inline . Это ключевое слово сообщает компилятору Kotlin, что он должен копировать и вставлять (или вставлять ) скомпилированный байт-код для функции каждый раз, когда функция используется. Это позволяет избежать накладных расходов на создание экземпляра нового класса для каждого action при каждом вызове этой функции.

Этот шаблон передачи кода с использованием лямбда-выражений, применения разумных значений по умолчанию, которые можно переопределить, и добавления этого поведения к существующим API с использованием inline функций расширения является типичным для улучшений, предоставляемых библиотекой Android KTX.

Используйте Android KTX в своем проекте

Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл build.gradle вашего проекта:

классный

repositories {
    google()
}

Котлин

repositories {
    google()
}

Модули AndroidX

Android KTX организован в виде модулей, каждый из которых содержит один или несколько пакетов.

Вы должны включить зависимость для каждого артефакта модуля в файл build.gradle вашего приложения. Не забудьте добавить номер версии к артефакту. Номера последних версий можно найти в соответствующем разделе каждого артефакта в этой теме.

Android KTX содержит один основной модуль , который предоставляет расширения Kotlin для общих API-интерфейсов платформы, а также несколько расширений для конкретной предметной области.

За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle . Например, вы можете заменить зависимость androidx.fragment:fragment на androidx.fragment:fragment-ktx . Этот синтаксис помогает лучше управлять версиями и не добавляет дополнительных требований к объявлению зависимостей.

Ядро КТХ

Модуль Core KTX предоставляет расширения для распространенных библиотек, которые являются частью платформы Android. Эти библиотеки не имеют зависимостей на основе Java, которые необходимо добавить в build.gradle .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.core:core-ktx:1.13.1"
}

Котлин

dependencies {
    implementation("androidx.core:core-ktx:1.13.1")
}

Вот список пакетов, содержащихся в модуле Core KTX:

Коллекция КТХ

Расширения Collection содержат служебные функции для работы с библиотеками коллекций Android, эффективно использующими память, включая ArrayMap , LongSparseArray , LruCache и другие.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.collection:collection-ktx:1.4.4"
}

Котлин

dependencies {
    implementation("androidx.collection:collection-ktx:1.4.4")
}

Расширения коллекций используют преимущества перегрузки операторов Kotlin для упрощения таких вещей, как объединение коллекций, как показано в следующем примере:

// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)

// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8

Фрагмент КТХ

Модуль Fragment KTX предоставляет ряд расширений для упрощения API фрагмента.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.8.3"
}

Котлин

dependencies {
    implementation("androidx.fragment:fragment-ktx:1.8.3")
}

С помощью модуля Fragment KTX вы можете упростить транзакции фрагментов с помощью лямбда-выражений, например:

fragmentManager().commit {
   addToBackStack("...")
   setCustomAnimations(
           R.anim.enter_anim,
           R.anim.exit_anim)
   add(fragment, "...")
}

Вы также можете выполнить привязку к ViewModel в одной строке, используя делегаты свойств viewModels и activityViewModels :

// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()

// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

Жизненный цикл КТХ

Lifecycle KTX определяет LifecycleScope для каждого объекта Lifecycle . Любая сопрограмма, запущенная в этой области, отменяется при уничтожении Lifecycle . Вы можете получить доступ к CoroutineScope Lifecycle , используя свойства lifecycle.coroutineScope или lifecycleOwner.lifecycleScope .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6")
}

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

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}

LiveData КТХ

При использовании LiveData вам может потребоваться асинхронное вычисление значений. Например, вы можете захотеть получить настройки пользователя и передать их в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию построения liveData , которая вызывает функцию suspend и обрабатывает результат как объект LiveData .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6")
}

В следующем примере loadUser() — это функция приостановки, объявленная в другом месте. Вы можете использовать функцию компоновщика liveData для асинхронного вызова loadUser() , а затем использовать emit() для выдачи результата:

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

Дополнительную информацию об использовании сопрограмм с LiveData см. в разделе Использование сопрограмм Kotlin с компонентами архитектуры .

Каждый компонент библиотеки навигации имеет свою собственную версию KTX, которая адаптирует API, чтобы сделать его более кратким и идиоматическим Kotlin.

Чтобы включить эти модули, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.8.1"
    implementation "androidx.navigation:navigation-fragment-ktx:2.8.1"
    implementation "androidx.navigation:navigation-ui-ktx:2.8.1"
}

Котлин

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.8.1")
    implementation("androidx.navigation:navigation-fragment-ktx:2.8.1")
    implementation("androidx.navigation:navigation-ui-ktx:2.8.1")
}

Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перехода к местам назначения, как показано в следующем примере:

class MyDestination : Fragment() {

    // Type-safe arguments are accessed from the bundle.
    val args by navArgs<MyDestinationArgs>()

    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.next)
            .setOnClickListener {
                // Fragment extension added to retrieve a NavController from
                // any destination.
                findNavController().navigate(R.id.action_to_next_destination)
            }
     }
     ...

}

Палитра КТХ

Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.palette:palette-ktx:1.0.0"
}

Котлин

dependencies {
    implementation("androidx.palette:palette-ktx:1.0.0")
}

Например, при работе с экземпляром Palette вы можете получить selected образец для заданной target с помощью оператора get ( [ ] ):

val palette = Palette.from(bitmap).generate()
val swatch = palette[target]

Реактивные потоки KTX

Модуль Reactive Streams KTX позволяет создавать наблюдаемый поток LiveData от издателя ReactiveStreams .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6")
}

В качестве примера предположим, что база данных имеет небольшой список пользователей. В своем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в своем пользовательском интерфейсе. Для этого вы можете использовать RxJava . Компонент Room Jetpack может получить список пользователей в виде Flowable . В этом сценарии вам также необходимо управлять подпиской издателя Rx на протяжении всего срока действия вашего фрагмента или действия.

Однако с LiveDataReactiveStreams вы можете воспользоваться преимуществами RxJava и его богатым набором операторов и возможностей планирования работы, одновременно работая с простотой LiveData , как показано в следующем примере:

val fun getUsersLiveData() : LiveData<List<User>> {
    val users: Flowable<List<User>> = dao.findUsers()
    return LiveDataReactiveStreams.fromPublisher(users)
}

Комната КТХ

Расширения комнат добавляют поддержку сопрограмм для транзакций базы данных.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.room:room-ktx:2.6.1"
}

Котлин

dependencies {
    implementation("androidx.room:room-ktx:2.6.1")
}

Вот несколько примеров, когда Room теперь использует сопрограммы. В первом примере используется функция suspend для возврата списка объектов User , а во втором — Flow Kotlin для асинхронного возврата списка User . Обратите внимание, что при использовании Flow вы также получаете уведомления о любых изменениях в запрашиваемых таблицах.

@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>

@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>

SQLite KTX

Расширения SQLite заключают код, связанный с SQL, в транзакции, устраняя большое количество шаблонного кода.

Чтобы использовать этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.sqlite:sqlite-ktx:2.4.0"
}

Котлин

dependencies {
    implementation("androidx.sqlite:sqlite-ktx:2.4.0")
}

Вот пример использования расширения transaction для выполнения транзакции базы данных:

db.transaction {
    // insert data
}

Просмотр модели KTX

Библиотека ViewModel KTX предоставляет функцию viewModelScope() , которая упрощает запуск сопрограмм из вашей ViewModel . CoroutineScope привязан к Dispatchers.Main и автоматически отменяется при очистке ViewModel . Вы можете использовать viewModelScope() вместо создания новой области для каждой ViewModel .

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6")
}

Например, следующая функция viewModelScope() запускает сопрограмму, которая выполняет сетевой запрос в фоновом потоке. Библиотека выполняет всю настройку и очистку соответствующей области:

class MainViewModel : ViewModel() {
    // Make a network request without blocking the UI thread
    private fun makeNetworkRequest() {
        // launch a coroutine in viewModelScope
        viewModelScope.launch  {
            remoteApi.slowFetch()
            ...
        }
    }

    // No need to override onCleared()
}

Менеджер работ КТХ

WorkManager KTX обеспечивает первоклассную поддержку сопрограмм.

Чтобы включить этот модуль, добавьте следующее в файл build.gradle вашего приложения:

классный

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.1"
}

Котлин

dependencies {
    implementation("androidx.work:work-runtime-ktx:2.9.1")
}

Вместо расширения Worker теперь вы можете расширить CoroutineWorker , у которого немного другой API. Например, если вы хотите создать простой CoroutineWorker для выполнения некоторых сетевых операций, вы можете сделать следующее:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
        : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result = coroutineScope {
        val jobs = (0 until 100).map {
            async {
                downloadSynchronously("https://www.google.com")
            }
        }

        // awaitAll will throw an exception if a download fails, which
        // CoroutineWorker will treat as a failure
        jobs.awaitAll()
        Result.success()
    }
}

Дополнительные сведения об использовании CoroutineWorker см. в разделе Потоки в CoroutineWorker .

WorkManager KTX также добавляет функции расширения в Operations и ListenableFutures для приостановки текущей сопрограммы.

Вот пример, который приостанавливает Operation , возвращаемую функцией enqueue() :

// Inside of a coroutine...

// Run async operation and suspend until completed.
WorkManager.getInstance()
        .beginWith(longWorkRequest)
        .enqueue().await()

// Resume after work completes...

Другие модули KTX

Вы также можете включить дополнительные модули KTX, существующие за пределами AndroidX.

Огневая база КТХ

Некоторые SDK Firebase для Android содержат библиотеки расширений Kotlin, которые позволяют вам писать идиоматический код Kotlin при использовании Firebase в вашем приложении. Для получения дополнительной информации см. следующие темы:

Платформа Google Карт KTX

Для Android SDK платформы Google Maps доступны расширения KTX, которые позволяют вам использовать преимущества некоторых функций языка Kotlin, таких как функции расширения, именованные параметры и аргументы по умолчанию, объявления деструктуризации и сопрограммы. Для получения дополнительной информации см. следующие темы:

Играть в ядро ​​KTX

Play Core KTX добавляет поддержку Cotlin Coroutines для одноразовых запросов и потока для мониторинга обновлений статуса, добавив функции расширения в SplitInstallManager и AppUpdateManager в библиотеке Play Core.

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "com.google.android.play:core-ktx:1.8.1"
}

Котлин

dependencies {
    implementation("com.google.android.play:core-ktx:1.8.1")
}

Вот пример Flow мониторинга статуса:

// Inside of a coroutine...

// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
    when (updateResult) {
        is AppUpdateResult.Available -> TODO()
        is AppUpdateResult.InProgress -> TODO()
        is AppUpdateResult.Downloaded -> TODO()
        AppUpdateResult.NotAvailable -> TODO()
    }
}

Дополнительная информация

Чтобы узнать больше об Android KTX, см. Видео Devbytes .

Чтобы сообщить о проблеме или предложить функцию, используйте Android KTX -трекер .

,

Android KTX Часть Android JetPack .

Android KTX - это набор расширений Kotlin, которые включены в Android JetPack и другие библиотеки Android. Расширения KTX обеспечивают краткий, идиоматический котлин для JetPack, Android Platform и другие API. Для этого эти расширения используют несколько языковых функций Kotlin, в том числе следующие:

  • Функции расширения
  • Расширенные свойства
  • Лямбдас
  • Названные параметры
  • Параметр значения по умолчанию
  • Кораки

Например, при работе с SharedPreferences вы должны создать редактор , прежде чем вы сможете внести изменения в данные настройки. Вы также должны применить или совершать эти изменения, когда вы закончите редактирование, как показано в следующем примере:

sharedPreferences
        .edit()  // create an Editor
        .putBoolean("key", value)
        .apply() // write to disk asynchronously

Котлин Lambdas идеально подходит для этого варианта использования. Они позволяют вам использовать более краткий подход, передавая блок кода для выполнения после создания редактора, позволяя коду выполнять, а затем позволив API SharedPreferences применить изменения атомно.

Вот пример одной из основных функций Android KTX, SharedPreferences.edit , которая добавляет функцию редактирования в SharedPreferences . Эта функция принимает необязательный boolean флаг в качестве первого аргумента, который указывает, следует ли совершать или применять изменения. Он также получает действие для выполнения в редакторе SharedPreferences в виде Lambda.

// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
//         commit: Boolean = false,
//         action: SharedPreferences.Editor.() -> Unit)

// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }

// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }

Звонитель может выбрать, следует ли совершать или применять изменения. action Lambda сама по себе является анонимной функцией расширения на SharedPreferences.Editor , которая возвращает Unit , как указано его подписью. Вот почему внутри блока вы можете выполнить работу непосредственно на SharedPreferences.Editor .

Наконец, подпись SharedPreferences.edit() содержит inline ключевое слово. Это ключевое слово говорит компилятору Kotlin, что он должен копировать и вставлять (или встроить ) скомпилированный байт -код для функции каждый раз, когда используется функция. Это позволяет избежать накладных расходов на создание нового класса для каждого action каждый раз, когда используется эта функция.

Этот шаблон передачи кода с использованием лямбдас, применение разумных дефолтов, которые могут быть переопределены, и добавление этих поведений к существующим API с использованием inline функций расширения, типично для улучшений, предоставленных библиотекой Android KTX.

Используйте Android KTX в своем проекте

Чтобы начать использовать Android KTX, добавьте следующую зависимость в файл вашего проекта build.gradle :

классный

repositories {
    google()
}

Котлин

repositories {
    google()
}

Модули Androidx

Android KTX организован в модули, где каждый модуль содержит один или несколько пакетов.

Вы должны включить зависимость для каждого артефакта модуля в файл вашего приложения build.gradle . Не забудьте добавить номер версии к артефакту. Вы можете найти последние номера версий в соответствующем разделе каждого артефакта в этой теме.

Android KTX содержит один базовый модуль , который обеспечивает расширения Kotlin для общих платформ API и несколько специфических для домена расширений.

За исключением основного модуля, все артефакты модуля KTX заменяют базовую зависимость Java в вашем файле build.gradle . Например, вы можете заменить androidx.fragment:fragment зависимость с androidx.fragment:fragment-ktx . Этот синтаксис помогает лучше управлять управлением версиями и не добавляет дополнительных требований объявления о зависимости.

Основной KTX

Основной модуль KTX предоставляет расширения для общих библиотек, которые являются частью Android Framework. Эти библиотеки не имеют зависимостей на основе Java, которые вам необходимо добавить в build.gradle .

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.core:core-ktx:1.13.1"
}

Котлин

dependencies {
    implementation("androidx.core:core-ktx:1.13.1")
}

Вот список пакетов, которые содержатся в модуле Core KTX:

Коллекция KTX

Расширения коллекции содержат полезные функции для работы с библиотеками Android, эффективными для памяти, включая ArrayMap , LongSparseArray , LruCache и другие.

Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.collection:collection-ktx:1.4.4"
}

Котлин

dependencies {
    implementation("androidx.collection:collection-ktx:1.4.4")
}

Расширения сбора используют преимущества перегрузки оператора Котлина, чтобы упростить такие вещи, как конкатенация сбора, как показано в следующем примере:

// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)

// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8

Фрагмент ktx

Модуль фрагмента KTX предоставляет ряд расширений для упрощения API фрагмента.

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.8.3"
}

Котлин

dependencies {
    implementation("androidx.fragment:fragment-ktx:1.8.3")
}

С помощью модуля фрагмента KTX вы можете упростить транзакции фрагментов с помощью Lambdas, например:

fragmentManager().commit {
   addToBackStack("...")
   setCustomAnimations(
           R.anim.enter_anim,
           R.anim.exit_anim)
   add(fragment, "...")
}

Вы также можете привязаться к ViewModel в одной строке, используя Delegates свойства viewModels и activityViewModels :

// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()

// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

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

Lifecycle KTX определяет LifecycleScope для каждого объекта Lifecycle . Любая Coroutine, запущенная в этой области, отменяется при уничтожении Lifecycle . Вы можете получить доступ к CoroutineScope Lifecycle с помощью lifecycle.coroutineScope или lifecycleOwner.lifecycleScope .

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.6")
}

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

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}

LiveData Ktx

При использовании Livedata вам может потребоваться асинхронно рассчитать значения. Например, вы можете захотеть получить предпочтения пользователя и обслуживать его в свой пользовательский интерфейс. Для этих случаев LiveData KTX предоставляет функцию строителя liveData , которая вызывает функцию suspend и служит результату как объект LiveData .

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.6")
}

В следующем примере loadUser() является подвесной функцией, объявленной в другом месте. Вы можете использовать функцию строителя liveData для вызова loadUser() асинхронно, а затем использовать emit() для излучения результата:

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

Для получения дополнительной информации об использовании CORUTINES с LiveData см. Использование COTLIN CORUTINES с компонентами архитектуры .

Каждый компонент навигационной библиотеки имеет свою собственную версию KTX, которая адаптирует API более лаконичным и котлин-идиоматическим.

Чтобы включить эти модули, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.8.1"
    implementation "androidx.navigation:navigation-fragment-ktx:2.8.1"
    implementation "androidx.navigation:navigation-ui-ktx:2.8.1"
}

Котлин

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.8.1")
    implementation("androidx.navigation:navigation-fragment-ktx:2.8.1")
    implementation("androidx.navigation:navigation-ui-ktx:2.8.1")
}

Используйте функции расширения и делегирование свойств для доступа к аргументам назначения и перейти к направлениям, как показано в следующем примере:

class MyDestination : Fragment() {

    // Type-safe arguments are accessed from the bundle.
    val args by navArgs<MyDestinationArgs>()

    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.next)
            .setOnClickListener {
                // Fragment extension added to retrieve a NavController from
                // any destination.
                findNavController().navigate(R.id.action_to_next_destination)
            }
     }
     ...

}

Палитра ktx

Модуль Palette KTX предлагает идиоматическую поддержку Kotlin для работы с цветовыми палитрами.

Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.palette:palette-ktx:1.0.0"
}

Котлин

dependencies {
    implementation("androidx.palette:palette-ktx:1.0.0")
}

Например, при работе с экземпляром Palette вы можете получить selected образец для данной target , используя оператор GET ( [ ] ):

val palette = Palette.from(bitmap).generate()
val swatch = palette[target]

Реактивные потоки ktx

Реактивные потоки KTX Модуль позволяет создавать наблюдаемый поток LiveData из издателя ReactiveStreams .

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.6")
}

В качестве примера предположим, что база данных с небольшим списком пользователей. В вашем приложении вы загружаете базу данных в память, а затем отображаете пользовательские данные в вашем пользовательском интерфейсе. Чтобы достичь этого, вы можете использовать rxjava . Компонент JetPack Room может получить список пользователей в качестве Flowable . В этом сценарии вы также должны управлять подпиской RX Publisher в течение жизни вашего фрагмента или деятельности.

Однако с помощью LiveDataReactiveStreams вы можете извлечь выгоду из Rxjava и ее богатого набора операторов и возможностей для обучения работы, а также работать с простотой LiveData , как показано в следующем примере:

val fun getUsersLiveData() : LiveData<List<User>> {
    val users: Flowable<List<User>> = dao.findUsers()
    return LiveDataReactiveStreams.fromPublisher(users)
}

Комната KTX

Расширения комнаты добавляют поддержку Coroutines для транзакций базы данных.

Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.room:room-ktx:2.6.1"
}

Котлин

dependencies {
    implementation("androidx.room:room-ktx:2.6.1")
}

Вот несколько примеров, где в комнате теперь используются коратики. В первом примере используется функция suspend , чтобы вернуть список User объектов, в то время как второй использует Flow Котлина для асинхронного возврата списка User . Обратите внимание, что при использовании Flow вы также уведомляете о любых изменениях в таблицах, которые вы запрашиваете.

@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>

@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>

SQLite KTX

Расширения SQLite Обертывают код, связанный с SQL, в транзакции, исключив много кода шаблона.

Чтобы использовать этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.sqlite:sqlite-ktx:2.4.0"
}

Котлин

dependencies {
    implementation("androidx.sqlite:sqlite-ktx:2.4.0")
}

Вот пример использования расширения transaction для выполнения транзакции базы данных:

db.transaction {
    // insert data
}

ViewModel KTX

Библиотека ViewModel KTX предоставляет функцию viewModelScope() , которая облегчает запуск CORUTINES с вашей ViewModel . CoroutineScope обязан для Dispatchers.Main и автоматически отменяется при очистке ViewModel . Вы можете использовать viewModelScope() вместо создания новой области для каждой ViewModel .

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6"
}

Котлин

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6")
}

В качестве примера, следующая функция viewModelScope() запускает Coroutine, которая делает сетевой запрос в фоновом потоке. Библиотека обрабатывает всю настройку и соответствующую очистку области:

class MainViewModel : ViewModel() {
    // Make a network request without blocking the UI thread
    private fun makeNetworkRequest() {
        // launch a coroutine in viewModelScope
        viewModelScope.launch  {
            remoteApi.slowFetch()
            ...
        }
    }

    // No need to override onCleared()
}

Workmanager Ktx

Workmanager KTX обеспечивает первоклассную поддержку для Coroutines.

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.1"
}

Котлин

dependencies {
    implementation("androidx.work:work-runtime-ktx:2.9.1")
}

Вместо того, чтобы расширять Worker , теперь вы можете расширить CoroutineWorker , который имеет немного другой API. Например, если вы хотите построить простого CoroutineWorker для выполнения некоторых сетевых операций, вы можете сделать следующее:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
        : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result = coroutineScope {
        val jobs = (0 until 100).map {
            async {
                downloadSynchronously("https://www.google.com")
            }
        }

        // awaitAll will throw an exception if a download fails, which
        // CoroutineWorker will treat as a failure
        jobs.awaitAll()
        Result.success()
    }
}

Для получения дополнительной информации об использовании CoroutineWorker см. Поток в CoroutineWorker .

Workmanager KTX также добавляет функции расширения к Operations и ListenableFutures для приостановки текущей коратики.

Вот пример, который приостанавливает Operation , которая возвращается enqueue() :

// Inside of a coroutine...

// Run async operation and suspend until completed.
WorkManager.getInstance()
        .beginWith(longWorkRequest)
        .enqueue().await()

// Resume after work completes...

Другие модули KTX

Вы также можете включить дополнительные модули KTX, которые существуют за пределами Androidx.

Firebase Ktx

У некоторых из SDK Firebase для Android есть библиотеки расширения Kotlin, которые позволяют вам писать идиоматический код котлина при использовании Firebase в вашем приложении. Для получения дополнительной информации см. Следующие темы:

Google Maps Platform Ktx

Существуют расширения KTX, доступные для платформы Google Maps Android SDK, которые позволяют использовать преимущества нескольких языковых функций Kotlin, таких как функции расширения, названные параметры и аргументы по умолчанию, объявления деструкции и коратики. Для получения дополнительной информации см. Следующие темы:

Играйте в Core KTX

Play Core KTX добавляет поддержку Cotlin Coroutines для одноразовых запросов и потока для мониторинга обновлений статуса, добавив функции расширения в SplitInstallManager и AppUpdateManager в библиотеке Play Core.

Чтобы включить этот модуль, добавьте следующее в файл вашего приложения build.gradle :

классный

dependencies {
    implementation "com.google.android.play:core-ktx:1.8.1"
}

Котлин

dependencies {
    implementation("com.google.android.play:core-ktx:1.8.1")
}

Вот пример Flow мониторинга статуса:

// Inside of a coroutine...

// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
    when (updateResult) {
        is AppUpdateResult.Available -> TODO()
        is AppUpdateResult.InProgress -> TODO()
        is AppUpdateResult.Downloaded -> TODO()
        AppUpdateResult.NotAvailable -> TODO()
    }
}

Дополнительная информация

Чтобы узнать больше об Android KTX, см. Видео Devbytes .

Чтобы сообщить о проблеме или предложить функцию, используйте Android KTX -трекер .