[Разработка под Android, Kotlin] Работа с библиотеками KTX (перевод)

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
24-Мар-2021 19:30
Привет, Хабр. В преддверии старта курсов "Android Developer. Basic" и "Android Developer. Professional" подготовили перевод материала.

Когда вы используете Android Java API в Kotlin, к вам достаточно быстро приходит понимание, что вам не хватает некоторых фич Kotlin, которые делают написание кода намного проще и приятнее. Вместо того, чтобы писать свои собственные обертки и функции расширения для этих API, я рекомендую вам обратить внимание на набор библиотек Jetpack KTX. В настоящее время более 20 библиотек имеют собственную KTX версию, создающую прекрасные идиоматические версии Java API, начиная от API платформы Android до ViewModels, SQLite и даже Play Core. В этой статье мы рассмотрим некоторые из доступных нам API и заглянем под капот, чтобы увидеть, как они были созданы.Если вы предпочитаете чтению просмотр видео, вы можете ознакомиться с материалом этой статьи здесь:Извините, данный ресурс не поддреживается. :( ОбнаруживаемостьЧтобы повысить обнаруживаемость функциональности ktx, рекомендуется всегда импортировать артефакт -ktx, если он доступен. Поскольку артефакт -ktx транзитивно зависит от не-ktx версии, вам не нужно включать другой артефакт. Например, для viewmodel у вас есть 2 артефакта: viewmodel и viewmodel-ktx. Артефакт -ktx будет содержать расширения Kotlin:
// Java language implementation
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// Kotlin implementation
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
Всегда импортируйте артефакт -ktx Для расширений API платформы Android следует импортировать артефакт core-ktx.
implementation "androidx.core:core-ktx:$corektx_version"
Большинство функций ktx реализовано как функции расширения, поэтому вы сможете легко найти их с помощью автокомплита в Android Studio.Другие функции, такие как деструктуризация и перегрузка операторов, доступные в таких классах, как Color, можно обнаружить в списке расширений KTX.API платформы — core-ktxcore-ktx обеспечивает идиоматическую функциональность Kotlin для API платформы Android.Например, если вы работаете с SharedPreferences, когда вам нужно обновить значение, вместо выполнения трех разных вызовов вы можете обойтись всего одним:
/* Copyright 2020 Google LLC.
   SPDX-License-Identifier: Apache-2.0 */
- val editor = sharedPreferences.edit()
- editor.putBoolean(SHOW_DELETED_WORDS_KEY, enable)
- editor.apply()
+ sharedPreferences.edit {
+ putBoolean(SHOW_DELETED_WORDS_KEY, enable)
+ }
SharedPrefs.kt.diff на GitHubПод капотом метод edit ktx вызывает ту же функциональность, по умолчанию предоставляя лучшую альтернативу commit — apply(). apply (), в отличие от commit(), фиксирует изменения на диске асинхронно:
// From https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:core/core-ktx/src/main/java/androidx/core/content/SharedPreferences.kt;l=39?q=SharedPreferences.kt
public inline fun SharedPreferences.edit(
    commit: Boolean = false,
    action: SharedPreferences.Editor.() -> Unit
) {
    val editor = edit()
    action(editor)
    if (commit) {
        editor.commit()
    } else {
        editor.apply()
    }
}
SharedPreferences.kt на GitHubВ core-ktx вы также можете найти более простой способ работы с часто используемыми листнерами платформы. Например, если вы хотите триггерить экшн по изменению текста в EditText, вам придется реализовать все методы TextWatcher, даже если вас интересует только onTextChanged(). core-ktx создает соответствующие методы TextWatcher: doOnTextChanged, doAfterTextChanged и doBeforeTextChanged, но в вашем коде Kotlin вы просто используете тот, который вам нужен:
/* Copyright 2020 Google LLC.
   SPDX-License-Identifier: Apache-2.0 */
- editWordView.addTextChangedListener(object : TextWatcher {
-     override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
-         handleTextChanged(s)
-     }
-
-     override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
-     }
-
-     override fun afterTextChanged(s: Editable) {
-     }
- })
+ editWordView.doOnTextChanged { text, start, count, after -> handleTextChanged(text) }
Edit.kt.diff на GitHubЭто дает несколько преимуществ: ваш код становится читабельнее, поскольку он лаконичнее, и вы получаете лучшие аннотации именования и nullability.Вы можете найти похожие API листнеров для AnimatorListener и TransitionListener.Под капотом doOnTextChanged реализован как функция расширения TextView — класса, который также имеет метод addTextChangedListener. doOnTextChanged создает пустые реализации для других функций TextWatcher.API JetpackБольшинство доступных расширений предназначены для API Jetpack. Здесь я просто рассмотрю некоторые из тех, которыми я пользовался чаще всего.LiveDataЛьвиная доля функциональности LiveData также реализовано в виде функций расширения: такие методы как map, switchMap или distinctUntilChanged (источник).Например, использование map из liveData-ktx избавляет нас от необходимости вызывать Transformations.map(liveata) { /* map function */ } и позволяет нам напрямую вызывать liveData.map более идиоматическим способом в духе Kotlin.Когда вы наблюдаете за объектом LiveData, вам необходимо реализовывать Observer. Но с использованием метода observe из lifecycle-ktx код становится намного проще. Убедитесь, что вы вызываете импорт androidx.lifecycle.observe, если метод не найден.
/* Copyright 2020 Google LLC.
   SPDX-License-Identifier: Apache-2.0 */
- wordViewModel.allWords.observe(
-     this,
-     Observer { words ->
-         // Update the cached copy of the words in the adapter.
-         words?.let { adapter.submitList(it) }
-     }
- )
+ wordViewModel.allWords.observe(owner = this) { words ->
+     // Update the cached copy of the words in the adapter.
+     words.let { adapter.submitList(it) }
+ }
Observe.kt.diff на GitHubLiveData идеально подходит для предоставления данных, которые будут использоваться пользовательским интерфейсом, поэтому для преобразования из Flow в LiveData и из LiveData в Flow, артефакт lifecycle-livedata-ktx предоставляет две удобных функций расширения: Flow.asLiveData() и LiveData.asFlow().Activity / Fragment и ViewModelЧтобы создать ViewModel, вы должны расширить класс ViewModel и реализовать ViewModelProvider.Factory, если ваша ViewModel имеет зависимости. Чтобы создать ее инстанс, используйте делегат viewModels (подробнее о делегатах вы можете почитать здесь): by viewModels(factory):
/* Copyright 2020 Google LLC.
   SPDX-License-Identifier: Apache-2.0 */
+ private val wordViewModel: WordViewModel by viewModels {
+     WordViewModelFactory(repository)
+ }
override fun onCreate(savedInstanceState: Bundle?) {

-     val viewModelFactory = WordViewModelFactory(repository)
-     val viewModel = ViewModelProvider(this, viewModelFactory).get(WordViewModel::class.java)
}
MyActivity.kt.diff на GitHubviewModels доступен в артефакте -ktx activity и fragment.При работе с корутинами вы столкнетесь с необходимостью запускать корутину в ViewModel. Работа, выполняемая корутиной, должна быть отменена при уничтожении ViewModel. Вместо реализации своего собственного CoroutineScope, используйте viewModelScope. Отмена будет произведена автоматически в ViewModel.onCleared(). Вы можете узнайте больше о тонкостях viewModelScope в этой статье.Room и WorkManagerИ Room, и WorkManager предлагают поддержку корутин через свои артефакты -ktx. Поскольку мы считаем, что об этом стоит рассказать более подробно, следите за обновлениями статей MAD ​​Skills, посвященных этим библиотекам!Другие модули KTXАртефакты AndroidX — не единственные, кто предоставляет KTX версии:
  • Google Maps предлагают Maps и Places библиотеки ktx
  • В Play Core есть артефакт core-ktx, обеспечивающий поддержку корутин для мониторинга обновлений в приложении
Лаконичность, удобочитаемость и Kotlin-идиоматичность — это фичи, которые принесут пользу вашему коду, как только вы начнете использовать -ktx расширения. Следите за новостями, чтобы узнать о других способах использовать Kotlin и Jetpack в своем приложении!
Узнать подробнее о курсах: "Android Developer. Basic" / "Android Developer. Professional".Приглашаем также на открытые вебинары:
«Крестики-нолики на минималках» — игра на Android менее чем за 2 часа.• «Рисуем свой график котировок в Android»:
- Рассмотрим основные инструменты для рисования
- Изучим возможности классов Canvas, Path, Paint
- Нарисуем кастомизируемый график котировок и добавим в него анимации

===========
Источник:
habr.com
===========

===========
Автор оригинала: Florina Muntenescu
===========
Похожие новости: Теги для поиска: #_razrabotka_pod_android (Разработка под Android), #_kotlin, #_kotlin, #_android_development, #_mad_skills, #_blog_kompanii_otus (
Блог компании OTUS
)
, #_razrabotka_pod_android (
Разработка под Android
)
, #_kotlin
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 15:31
Часовой пояс: UTC + 5