Я работаю над проектом Compose Multiplatform с использованием Koin для инъекции зависимостей, Voyager для навигации и места для управления базами данных. Я сталкиваюсь с NodefinitionFoundException при попытке предоставить экземпляр ForgoDatabase с помощью rapdatabase.builder. Мой основной источник для всех библиотек - их документация и некоторые реализации на Github для руководства. Я проверил много реализаций в разных подходах и не могу понять, какова моя ошибка. build.gradle:
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.androidApplication)
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.ksp.plugin)
alias(libs.plugins.room.gradle.plugin)
}
kotlin {
androidTarget {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
linkerOpts.add("-lsqlite3")
}
}
room {
schemaDirectory("$projectDir/schemas")
}
sourceSets {
commonTest.dependencies {
implementation(libs.kotlin.test)
}
androidMain.dependencies {
implementation(compose.preview)
implementation(libs.androidx.activity.compose)
implementation(libs.koin.android)
implementation(libs.koin.androidx.compose)
}
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.kotlinx.date.time)
implementation(libs.kotlinx.coroutines)
// Voyager
implementation(libs.bundles.voyager)
// Koin
implementation(libs.koin.compose)
implementation(libs.koin.viewmodel)
api(libs.koin.core)
// Room
implementation(libs.room.runtime)
implementation(libs.sqlite)
}
all {
languageSettings.optIn("kotlin.ExperimentalMultiplatform")
languageSettings.optIn("kotlin.RequiresOptIn")
}
}
compilerOptions {
freeCompilerArgs.add("-Xexpect-actual-classes")
}
}
android {
namespace = "com.feeltheboard.forgo"
compileSdk = libs.versions.android.compileSdk.get().toInt()
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
sourceSets["main"].res.srcDirs("src/androidMain/res")
sourceSets["main"].resources.srcDirs("src/commonMain/composeResources")
defaultConfig {
applicationId = "com.feeltheboard.forgo"
minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 2
versionName = "1.0.2"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
debugImplementation(compose.uiTooling)
add("kspCommonMainMetadata", libs.room.ksp)
add("kspAndroid", libs.room.ksp)
add("kspIosSimulatorArm64", libs.room.ksp)
add("kspIosX64", libs.room.ksp)
add("kspIosArm64", libs.room.ksp)
}
Версии библиотек:
[versions]
agp = "8.9.0"
android-compileSdk = "35"
android-minSdk = "24"
android-targetSdk = "35"
androidx-activityCompose = "1.10.1"
androidx-appcompat = "1.7.0"
androidx-constraintlayout = "2.2.1"
androidx-core-ktx = "1.15.0"
androidx-espresso-core = "3.6.1"
androidx-lifecycle = "2.8.4"
androidx-material = "1.12.0"
androidx-test-junit = "1.2.1"
compose-multiplatform = "1.7.0"
kotlinx-coroutines="1.8.1"
kotlinx-date-time="0.6.2"
junit = "4.13.2"
koin = "4.0.2"
kotlin = "2.1.0"
ksp = "2.1.0-1.0.29"
room = "2.7.0-rc02"
sqlite = "2.5.0-alpha01"
voyager = "1.1.0-beta02"
Вот мой sharedmodule в Commonmain:
expect val platformModule: Module
val sharedModule = module {
single { getRoomDatabase(get()) }
single { ForgoRepositoryImpl(get()) }
factory { HomeViewModel(get()) }
factory { TaskViewModel(get()) }
}
fun appModules() = listOf(sharedModule, platformModule)
Реализация базы данных комнаты + Строитель базы данных на CommonMain:
@Database(entities = [Task::class], version = 5, exportSchema = true)
@ConstructedBy(ForgoDatabaseConstructor::class)
abstract class ForgoDatabase : RoomDatabase() {
abstract fun taskDao(): TaskDao
}
@Suppress("NO_ACTUAL_FOR_EXPECT")
expect object ForgoDatabaseConstructor : RoomDatabaseConstructor {
override fun initialize(): ForgoDatabase
}
fun getRoomDatabase(
builder: RoomDatabase.Builder
): ForgoDatabase {
return builder
.fallbackToDestructiveMigrationOnDowngrade(dropAllTables = true)
.setDriver(BundledSQLiteDriver())
.setQueryCoroutineContext(Dispatchers.IO)
.build()
}
Основная реализация Android с застройщиком, модулями, MainActivity и Application (добавлено в Manifest):
fun getDatabaseBuilder(
ctx: Context
): RoomDatabase.Builder {
val appContext = ctx.applicationContext
val dbFile = appContext.getDatabasePath("task.db")
return Room.databaseBuilder(
context = appContext,
name = dbFile.absolutePath
)
}
actual val platformModule: Module = module {
single { getDatabaseBuilder(ctx = get()) }
}
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
initializeKoin {
androidContext(this@MainApplication)
}
}
}
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
App()
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... atform-pro
Koin nodefinitionfoundexception для базы данных комнаты в комплексном проекте Multiplatform ⇐ Android
Форум для тех, кто программирует под Android
1743550690
Гость
Я работаю над проектом Compose Multiplatform с использованием Koin для инъекции зависимостей, Voyager для навигации и места для управления базами данных. Я сталкиваюсь с NodefinitionFoundException при попытке предоставить экземпляр ForgoDatabase с помощью rapdatabase.builder. Мой основной источник для всех библиотек - их документация и некоторые реализации на Github для руководства. Я проверил много реализаций в разных подходах и не могу понять, какова моя ошибка. build.gradle:
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.androidApplication)
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.ksp.plugin)
alias(libs.plugins.room.gradle.plugin)
}
kotlin {
androidTarget {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
linkerOpts.add("-lsqlite3")
}
}
room {
schemaDirectory("$projectDir/schemas")
}
sourceSets {
commonTest.dependencies {
implementation(libs.kotlin.test)
}
androidMain.dependencies {
implementation(compose.preview)
implementation(libs.androidx.activity.compose)
implementation(libs.koin.android)
implementation(libs.koin.androidx.compose)
}
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.kotlinx.date.time)
implementation(libs.kotlinx.coroutines)
// Voyager
implementation(libs.bundles.voyager)
// Koin
implementation(libs.koin.compose)
implementation(libs.koin.viewmodel)
api(libs.koin.core)
// Room
implementation(libs.room.runtime)
implementation(libs.sqlite)
}
all {
languageSettings.optIn("kotlin.ExperimentalMultiplatform")
languageSettings.optIn("kotlin.RequiresOptIn")
}
}
compilerOptions {
freeCompilerArgs.add("-Xexpect-actual-classes")
}
}
android {
namespace = "com.feeltheboard.forgo"
compileSdk = libs.versions.android.compileSdk.get().toInt()
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
sourceSets["main"].res.srcDirs("src/androidMain/res")
sourceSets["main"].resources.srcDirs("src/commonMain/composeResources")
defaultConfig {
applicationId = "com.feeltheboard.forgo"
minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 2
versionName = "1.0.2"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
debugImplementation(compose.uiTooling)
add("kspCommonMainMetadata", libs.room.ksp)
add("kspAndroid", libs.room.ksp)
add("kspIosSimulatorArm64", libs.room.ksp)
add("kspIosX64", libs.room.ksp)
add("kspIosArm64", libs.room.ksp)
}
[b] Версии библиотек: [/b]
[versions]
agp = "8.9.0"
android-compileSdk = "35"
android-minSdk = "24"
android-targetSdk = "35"
androidx-activityCompose = "1.10.1"
androidx-appcompat = "1.7.0"
androidx-constraintlayout = "2.2.1"
androidx-core-ktx = "1.15.0"
androidx-espresso-core = "3.6.1"
androidx-lifecycle = "2.8.4"
androidx-material = "1.12.0"
androidx-test-junit = "1.2.1"
compose-multiplatform = "1.7.0"
kotlinx-coroutines="1.8.1"
kotlinx-date-time="0.6.2"
junit = "4.13.2"
koin = "4.0.2"
kotlin = "2.1.0"
ksp = "2.1.0-1.0.29"
room = "2.7.0-rc02"
sqlite = "2.5.0-alpha01"
voyager = "1.1.0-beta02"
[b] Вот мой sharedmodule в Commonmain: [/b]
expect val platformModule: Module
val sharedModule = module {
single { getRoomDatabase(get()) }
single { ForgoRepositoryImpl(get()) }
factory { HomeViewModel(get()) }
factory { TaskViewModel(get()) }
}
fun appModules() = listOf(sharedModule, platformModule)
[b] Реализация базы данных комнаты + Строитель базы данных на CommonMain: [/b]
@Database(entities = [Task::class], version = 5, exportSchema = true)
@ConstructedBy(ForgoDatabaseConstructor::class)
abstract class ForgoDatabase : RoomDatabase() {
abstract fun taskDao(): TaskDao
}
@Suppress("NO_ACTUAL_FOR_EXPECT")
expect object ForgoDatabaseConstructor : RoomDatabaseConstructor {
override fun initialize(): ForgoDatabase
}
fun getRoomDatabase(
builder: RoomDatabase.Builder
): ForgoDatabase {
return builder
.fallbackToDestructiveMigrationOnDowngrade(dropAllTables = true)
.setDriver(BundledSQLiteDriver())
.setQueryCoroutineContext(Dispatchers.IO)
.build()
}
[b] Основная реализация Android с застройщиком, модулями, MainActivity и Application (добавлено в Manifest): [/b]
fun getDatabaseBuilder(
ctx: Context
): RoomDatabase.Builder {
val appContext = ctx.applicationContext
val dbFile = appContext.getDatabasePath("task.db")
return Room.databaseBuilder(
context = appContext,
name = dbFile.absolutePath
)
}
actual val platformModule: Module = module {
single { getDatabaseBuilder(ctx = get()) }
}
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
initializeKoin {
androidContext(this@MainApplication)
}
}
}
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
App()
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79522285/koin-nodefinitionfoundexception-for-room-database-in-a-compose-multiplatform-pro[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия