使用@KoinViewModel时加@InjectedParam崩溃,缺失什么注解?
问题描述
原本带有@KoinViewModel注解的TargetVm可正常实例化,为其添加一个用@Factory注解的Test类作为构造参数后,程序运行崩溃,报错信息如下:
Caused by: org.koin.core.error.NoParameterFoundException: Can't get injected parameter #0 from DefinitionParameters[] for type 'es.elhaso.bitjump.Test' at org.koin.core.parameter.ParametersHolder.elementAt(ParametersHolder.kt:45) ... 93 more
相关代码如下:
原正常运行的代码
@KoinViewModel class TargetVm() : ViewModel() { … } @Composable fun SomeView() { val vm = koinViewModel<TargetVm>() … }
修改后报错的代码
@Factory class Test { constructor() { Log.d(TAG, "Constructor") } } @KoinViewModel class TargetVm( @InjectedParam val bitPrefs: Test ) : ViewModel() { … }
Koin初始化代码
class MainApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidLogger() androidContext(this@MainApplication) defaultModule() … }
问题原因与解决方法
1. 注解使用错误
@InjectedParam的作用是接收外部手动传递的参数(比如调用koinViewModel时通过parameters lambda传入),而非让Koin从容器中注入已注册的依赖。你已经用@Factory将Test类注册到Koin容器中,此时添加@InjectedParam会误导Koin去寻找外部传入的参数,从而触发报错。
2. 修正核心代码
直接去掉TargetVm构造参数上的@InjectedParam注解即可:
@KoinViewModel class TargetVm( val bitPrefs: Test ) : ViewModel() { // ... }
3. 确保加载注解生成的模块
使用@Factory和@KoinViewModel这类编译时注解时,Koin会自动生成对应的依赖模块,需要在初始化时加载该模块。检查startKoin配置,确保包含注解生成的模块:
class MainApplication : Application() { override fun onCreate() { super.onCreate() startKoin { androidLogger() androidContext(this@MainApplication) // 加载注解生成的模块 modules(annotatedModule()) // 若有自定义模块,可同时加载 // modules(defaultModule(), annotatedModule()) } } }
4. 检查依赖配置(可选)
确保项目已添加Koin注解相关依赖(以Gradle为例):
// 注解处理器 kapt "io.insert-koin:koin-annotations-compiler:${koin_version}" // Koin核心与AndroidX Compose支持 implementation "io.insert-koin:koin-annotations:${koin_version}" implementation "io.insert-koin:koin-androidx-compose:${koin_version}"
内容的提问来源于stack exchange,提问作者Grzegorz Adam Hankiewicz
相关产品推荐
相关产品推荐

