我想在我的koin应用程序中有一个可为空的bean,例如:

single(named("NULLABLE")) {
    System.getenv("NULLABLE")
}


即如果设置了环境变量“NULLABLE”,则名为“NULLABLE”的bean(此处为字符串)将具有其值,否则它将为null。

用法可能是这样的:
init {
    startKoin {
        modules(listOf(module))
    }
}

val nullableString: String? by inject(named("NULLABLE"))

但是,如果没有名为“NULLABLE”的环境变量,则会出现异常:

Exception in thread "main" java.lang.IllegalStateException: Single instance created couldn't return value
    at org.koin.core.instance.SingleDefinitionInstance.get(SingleDefinitionInstance.kt:42)
    at org.koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70)
    at org.koin.core.scope.Scope.resolveInstance(Scope.kt:165)
    at org.koin.core.scope.Scope.get(Scope.kt:128)

这是因为当前,当工厂lambda返回null时,SingleDefinitionInstance引发异常:
override fun <T> get(context: InstanceContext): T {
    if (value == null) {
        value = create(context)
    }
    return value as? T ?: error("Single instance created couldn't return value")
}

Koin是否可能有可空(可选)的bean?

最佳答案

我没有找到一种可行的官方方式。
我用以下代码片段解决了我的问题:

   val data: ClassModel? = try {
        get(named("YourNamedValue"))
    } catch (e: InstanceCreationException) {
        null
    } catch (e: IllegalStateException) {
        null
    }

10-08 17:15