Как было сказано в прошлой теме, все зависимости, которые использует проект, должны быть указаны в секции dependencies
файла сборки Gradle уровня модуля. Например, в проекте по умолчанию
есть модуль app, для которого автоматически создается файл build.gradle.kts (Module :app). Соответственно все зависимости этого модуля добавляются в этот файл. Рассмотрим небольшой пример. Например, в приложении Jetpack Compose
можно применять класс ViewModel, который является посредником между данными и пользовательским интерфейсом. И через ViewModel идет взаимодействие между данными и графическим интерфейсом. Но для полноценной работы с ViewModel необходимо добавить соответствующую зависимость.
Чтобы было понятно, о чем речь, привиду минимальный код:
package com.example.testapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.lifecycle.ViewModel import androidx.lifecycle.viewmodel.compose.viewModel class AppViewModel : ViewModel() class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val vm: AppViewModel = viewModel() } } }
Здесь мы определяем класс AppViewModel. Затем создаем его переменную. Для создания переменной используется функция viewModel()
. Она эта функция недоступна:
В проект по умолчанию уже подключается некоторый набор базовых зависимостей, но эти зависимости не содержат функцию viewModel()
. И всплывающая подксказка говорит нам, что нам нужно
добавить зависимость "androidx.lifecycle:lifecycle-viewmodel-compose". Есть два способа добавления зависимостей. Рассмотрим оба из них.
Раньше зависимости добавлялись напрямую в файл build.gradle.kts уровня модуля в секцию dependecies. Так, откроем файл build.gradle.kts (Module :app)
В этом файле ближе к низу найдем секцию dependencies, которая хранит добавленные в проект зависимости и которая выглядит примерно следующим образом:
dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) }
Внутрь этой секции, например, самое начало добавим строку
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0")
То есть в итоге получится
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0") implementation(libs.androidx.core.ktx) // остальные зависимости ........................................ }
Для добавления библиотек может применяться вызов implementation, в который передается добавляемая зависимость в формате:
implementation("имя_библиотеки:версия_библиотеки")
То есть мы добавляем в качестве зависимости библиотеку "androidx.lifecycle:lifecycle-viewmodel-compose" версии 2.7.0. И чтобы изменения в файле Gradle были применены, нажмем на кнопку Sync Now
После этого мы сможем спокойно использовать функцию viewModel и другую функциональность подключенной библиотеки.
Хотя мы можем использовать способ, описанный выше, но в настоящее время также используется другой подход с управлением библиотеками и их версиями в каталог версий. Так, откроем файл каталога версий libs.versions.toml
Перейдем к секции [libraries] в этом файле. По умочланию он выглядит примерно следующим образом:
[libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
В эту секции (в конец или в начало) добавим строку
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" }
Например, при добавлении в начало получится примерно так:
[libraries] androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } junit = { group = "junit", name = "junit", version.ref = "junit" }
Далее в файл build.gradle.kts (Module :app) в секцию dependencies
добавим саму зависимость
dependencies { implementation(libs.androidx.lifecycle.viewmodel.compose) ...................................
И для синхронизации проекта также нажмем на кнопку "Sync Now":
В предыдущем примере библиотека "androidx-lifecycle-viewmodel-compose" использовала ту же версию, что и библиотека "androidx-lifecycle-runtime-ktx" - они обе ссылались на одно и то же имя - "lifecycleRuntimeKtx", поскольку они используются вместе
[libraries] androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } ................................ androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
И для этого имени в секции [versions] устанавливалась версия 2.7.0:
[versions] ............................. lifecycleRuntimeKtx = "2.7.0" # версия библиотек
Для других библиотек можно указать свою версию. Например, возьмем библиотеку Room, которая используется для взаимодействия с базой данных. Для ее добавления в файле
libs.versions.toml в секции [libraries]
сначала укажем саму библиотеку:
[libraries] ............................ androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" }
Далее в секции [versions]
укажем версию этой библиотеки:
[versions] .................. roomRuntime = "2.6.1"
Наконец, в файле подключим эту зависимость:
dependencies { implementation(libs.androidx.room.runtime) }
И для синхронизации конфигурации с проектом нажмем на кнопку "Sync Now"
Если вдруг появится новая версия какой-то библиотеки, то мы увидим соответствующее уведомление в файле libs.versions.toml