【问题标题】:Koin Android: org.koin.error.NoBeanDefFoundExceptionKoin Android:org.koin.error.NoBeanDefFoundException
【发布时间】:2018-07-05 15:48:34
【问题描述】:

收到该消息错误

java.lang.RuntimeException: Unable to create application com.app.name.application.MainApplication: org.koin.error.BeanInstanceCreationException: Can't create bean Bean[class=com.app.name.general.preferences.Preferences] due to error :
    org.koin.error.NoBeanDefFoundException: No definition found to resolve type 'android.app.Application'. Check your module definition
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5830)
    at android.app.ActivityThread.-wrap1(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1673)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:172)
    at android.app.ActivityThread.main(ActivityThread.java:6637)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: org.koin.error.BeanInstanceCreationException: Can't create bean Bean[class=com.app.name.general.preferences.Preferences] due to error :
    org.koin.error.NoBeanDefFoundException: No definition found to resolve type 'android.app.Application'. Check your module definition
    at org.koin.core.instance.InstanceFactory.createInstance(InstanceFactory.kt:63)
    at org.koin.core.instance.InstanceFactory.retrieveInstance(InstanceFactory.kt:26)
    at org.koin.KoinContext$resolveInstance$$inlined$synchronized$lambda$1.invoke(KoinContext.kt:85)
    at org.koin.KoinContext$resolveInstance$$inlined$synchronized$lambda$1.invoke(KoinContext.kt:23)
    at org.koin.ResolutionStack.resolve(ResolutionStack.kt:23)
    at org.koin.KoinContext.resolveInstance(KoinContext.kt:80)
    at com.app.name.constants.EnvironmentConstants$initEnvironmentVariables$$inlined$getKoinInstance$1$1.invoke(KoinComponent.kt:114)
    at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131)
    at com.app.name.constants.EnvironmentConstants$initEnvironmentVariables$$inlined$getKoinInstance$1.getValue(Unknown Source:7)
    at com.app.name.constants.EnvironmentConstants.initEnvironmentVariables(EnvironmentConstants.kt:180)
    at com.app.name.application.MainApplication.onCreate(MainApplication.kt:59)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1119)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5827)
        ... 8 more

但所有依赖项都是正确的。

我还注意到没有androidApplication() 参数的模块可以正常工作。

代码如下:

    startKoin(listOf(
            imageManagerModule,
            databaseRepositoryModule
    ))

ImageManager 完美运行

val imageManagerModule: Module = applicationContext {
    bean { ImageManagerImpl() as ImageManager }
}

但首选项崩溃

val preferencesModule: Module = applicationContext {
    bean { PreferencesImpl(androidApplication()) as Preferences }
}

【问题讨论】:

    标签: android kotlin koin


    【解决方案1】:

    解决方案很简单,但并不那么明显。

    Android Studio 不知何故导入了独立的startKoin 函数,而不是特定的 android 函数。

    所以我不得不更换

    import org.koin.standalone.StandAloneContext.startKoin
    

    import org.koin.android.ext.android.startKoin
    

    这行得通!

    【讨论】:

    • import org.koin.android.ext.android.startKoin 在生产代码中可用,但在测试中不可用。如何使其在测试代码中可用?
    • @windchime 如果您的意思是 jUnit 测试,我想您应该避免使用 ext.android =) 换句话说,在 jUnit 中使用独立上下文。
    • 测试的时候也出现这个错误。 koin + coroutines,好像不太好用这篇文章只有epxlain 如何使用kotlin coroutines medium.com/@tonyowen/…
    【解决方案2】:

    就我而言,我需要这样做:

    import android.app.Application
     import org.koin.android.ext.koin.androidContext
      import org.koin.android.ext.koin.androidFileProperties
    import org.koin.android.ext.koin.androidLogger
    import org.koin.android.viewmodel.dsl.viewModel
    import org.koin.core.context.startKoin
    import org.koin.core.module.Module
    import org.koin.dsl.module
    class MyApplication : Application() {
    override fun onCreate(){
        super.onCreate()
        // start Koin!
        startKoin {
            // Android context
            androidLogger()
            androidContext(this@MyApplication)
            // use the Android context given there
            // load properties from assets/koin.properties file
            androidFileProperties()
    
    
            // modules
            modules(myModule)
        }
    }
    val myModule: Module = module { viewModel { MyViewModel() }}
    
    }
    

    并使用旧的依赖项:

     implementation("org.koin:koin-android:2.0.1")
    implementation("org.koin:koin-android-viewmodel:2.0.1")
    

    【讨论】:

      【解决方案3】:

      我有类似的问题, 尝试仅添加此依赖项即可解决

      // Room implementation "android.arch.persistence.room:runtime:1.1.1" kapt "android.arch.persistence.room:compiler:1.1.1" .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多