You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Koin注解传递Context时缺失定义类型,@Single注解报错咨询

问题解决:Koin中EncryptedSharedPreferences注入报错及@Single注解问题

核心错误原因

你遇到的三个关联问题:

  1. Context依赖未识别:SharedPreferenceModule中误用了Spring的@ComponentScan注解,Koin不支持该注解,导致模块无法关联初始化时传入的Application上下文,解析provideSharedPreferences的Context参数失败。
  2. 类型不匹配:provideSharedPreferences返回SharedPreferences接口,但注入类依赖的是具体实现类EncryptedSharedPreferences,Koin默认按返回类型注册实例,因此找不到对应依赖。
  3. 模块加载方式错误:IDE提示的Unresolved reference: module,是因为你试图通过SharedPreferenceModule().module获取模块,而Koin注解式模块无需手动创建实例,需通过KSP生成的代码加载。

修复步骤

1. 修正SharedPreferenceModule的注解与返回类型

移除Spring注解,改用Koin规范注解,同时调整返回类型匹配注入需求:

import android.content.Context
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKeys
import org.koin.core.annotation.Module
import org.koin.core.annotation.Single

@Module
class SharedPreferenceModule {

    companion object {
        private const val FILE_NAME = "secret_shared_prefs"
    }

    @Single
    fun provideEncryptedSharedPreferences(context: Context): EncryptedSharedPreferences {
        val masterKeys = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

        return EncryptedSharedPreferences.create(
            FILE_NAME,
            masterKeys,
            context,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        ) as EncryptedSharedPreferences
    }

    // 可选:如果需要同时提供SharedPreferences接口,添加绑定
    @Single
    fun provideSharedPreferences(encryptedPrefs: EncryptedSharedPreferences): SharedPreferences = encryptedPrefs
}

2. 修正Koin初始化的模块加载逻辑

直接传入模块类,由KSP自动处理模块实例:

startKoin {
    androidLogger()
    androidContext(this@BusbyTravelMateApplication)
    modules(
        networkModule,
        repositoryModule,
        useCaseModule,
        userModule,
        // 直接传入模块类,无需手动创建实例
        SharedPreferenceModule::class
    )
}

3. 调整注入类的依赖类型(二选一)

  • 若保留provideSharedPreferences返回SharedPreferences,修改注入类参数类型:
class UserTokenLocalDataSourceImp(private val sharedPreferences: SharedPreferences)
    : UserTokenLocalDataSource {

    companion object {
        private const val TOKEN = "token"
    }

    override suspend fun saveUserToken(token: String) {
        sharedPreferences.edit {
            putString(TOKEN, token)
            apply()
        }
    }

    override suspend fun fetchUserToken(): String? {
        return sharedPreferences.getString(TOKEN, null)
    }
}
  • 若坚持依赖EncryptedSharedPreferences,直接使用第一步中provideEncryptedSharedPreferences的返回类型即可。

额外注意事项

  • 确保项目已正确配置Koin的KSP插件,注解式模块依赖KSP生成代码才能被Koin识别。
  • 检查koin-android、koin-core与KSP插件的版本兼容性,避免版本冲突。

内容的提问来源于stack exchange,提问作者ant2009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:23:13