Roberto Fernandez Montero
06/12/2025, 9:32 AM[ksp] --> Missing Definition for property 'settings : com.russhwolf.settings.Settings' in 'com.binshelve.data.local.UserRepository'. Fix your configuration: add definition annotation on the class.
Kibet Theophilus
06/12/2025, 10:24 AMclass LocalRepository(....)
Roberto Fernandez Montero
06/12/2025, 10:50 AMpackage com.binshelve.shared.data
import com.russhwolf.settings.Settings
import org.koin.core.annotation.Factory
import org.koin.core.annotation.Module
@Module
expect class SettingsModule() {
@Factory
fun providesSettings(): Settings
}
expect fun settings(): Settings
And the actual implementations (Wasm as example)
package com.binshelve.shared.data
import com.russhwolf.settings.Settings
import com.russhwolf.settings.StorageSettings
import org.koin.core.annotation.Factory
import org.koin.core.annotation.Module
import org.koin.core.annotation.Single
@Module
actual class SettingsModule actual constructor() {
@Factory
actual fun providesSettings() = settings()
}
actual fun settings(): Settings = StorageSettings()
Also in my app gradle module, I have this
package com.binshelve.ui.components
import androidx.compose.runtime.Composable
import com.binshelve.data.di.DataModule
import com.binshelve.shared.SharedModule
import com.binshelve.ui.di.UIModule
import com.binshelve.ui.screen.application.applicationsUiModule
import com.binshelve.usecases.di.UseCasesModule
import org.koin.compose.KoinApplication
import org.koin.ksp.generated.module
@Composable
fun Koin(content: @Composable () -> Unit) {
KoinApplication(
application = {
modules(
UIModule().module,
DataModule().module,
UseCasesModule().module,
SettingsModule().module,
applicationsUiModule, //Needed to instantiate viewmodel with params
)
}
) { content() }
}
And also in build.gradle.kts configurations for app
dependencies {
debugImplementation(compose.uiTooling)
add("kspCommonMainMetadata", libs.koin.ksp.compiler)
add("kspJs", libs.koin.ksp.compiler)
add("kspJvm", libs.koin.ksp.compiler)
add("kspWasmJs", libs.koin.ksp.compiler)
add("kspAndroid", libs.koin.ksp.compiler)
}
ksp {
arg("KOIN_CONFIG_CHECK", "true")
arg("KOIN_USE_COMPOSE_VIEWMODEL", "true")
arg("KOIN_DEFAULT_MODULE", "true")
}
tasks.withType<KotlinCompilationTask<*>>().all {
if(name != "kspCommonMainKotlinMetadata") {
dependsOn("kspCommonMainKotlinMetadata")
}
}
tasks.findByName("compileDebugKotlinAndroid")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileReleaseKotlinAndroid")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileKotlinJvm")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileKotlinJs")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileKotlinWasmJs")?.dependsOn("kspCommonMainKotlinMetadata")
And build.gradle.kts in shared module
dependencies {
implementation(libs.androidx.startup.runtime)
ksp(libs.koin.ksp.compiler)
add("kspCommonMainMetadata", libs.koin.ksp.compiler)
add("kspJs", libs.koin.ksp.compiler)
add("kspJvm", libs.koin.ksp.compiler)
add("kspWasmJs", libs.koin.ksp.compiler)
add("kspAndroid", libs.koin.ksp.compiler)
}
ksp {
arg("KOIN_DEFAULT_MODULE", "true")
}
tasks.withType<KotlinCompilationTask<*>>().all {
if (name != "kspCommonMainKotlinMetadata") {
dependsOn("kspCommonMainKotlinMetadata")
}
}
tasks.findByName("compileDebugKotlinAndroid")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileReleaseKotlinAndroid")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileKotlinJvm")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileKotlinJs")?.dependsOn("kspCommonMainKotlinMetadata")
tasks.findByName("compileKotlinWasmJs")?.dependsOn("kspCommonMainKotlinMetadata")
And usage of it is simple
@Single
class UserRepository(
private val json: Json = Json { ignoreUnknownKeys = true },
private val settings: Settings,
) {
fun saveUser(user: User) {
settings.putString("user", json.encodeToString(user))
}
fun getUser(): User? =
settings.getStringOrNull("user")?.let { json.decodeFromString(it) }
}
Am I missing something?Roberto Fernandez Montero
06/12/2025, 10:51 AMKibet Theophilus
06/12/2025, 10:52 AM@Provided
i.e
@Single
class UserRepository(
private val json: Json = Json { ignoreUnknownKeys = true },
@Provided private val settings: Settings,
) {
....
}
Roberto Fernandez Montero
06/12/2025, 11:49 AMe: file:///Users/user/branches/Binshelve/composeApp/src/commonMain/kotlin/com/binshelve/ui/components/Koin.kt:20:32 None of the following candidates is applicable:
val DataModule.module: Module
val UIModule.module: Module
val UseCasesModule.module: Module
It is not able to find SettingsModule (Which is in shared gradle's module)
Looks like annotations are not being well processed?Kibet Theophilus
06/12/2025, 11:50 AMRoberto Fernandez Montero
06/12/2025, 11:50 AMRoberto Fernandez Montero
06/12/2025, 12:52 PMKibet Theophilus
06/12/2025, 12:53 PMRoberto Fernandez Montero
06/12/2025, 12:54 PMRoberto Fernandez Montero
06/13/2025, 9:51 AMRoberto Fernandez Montero
06/13/2025, 9:51 AMKibet Theophilus
06/13/2025, 9:53 AM