【问题标题】:Kodein returns a new instance instead of singletonKodein 返回一个新实例而不是单例
【发布时间】:2020-04-10 14:14:30
【问题描述】:

我是 Kodein 的新手,我有这个简单的模块:

import com.myapp.MyApplication.Companion.INSTANCE
import com.facebook.flipper.android.AndroidFlipperClient
import com.facebook.flipper.core.FlipperClient
import com.facebook.flipper.plugins.inspector.DescriptorMapping
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.kodein.di.Kodein
import org.kodein.di.generic.bind
import org.kodein.di.generic.instance
import org.kodein.di.generic.singleton

const val FLIPPER_MODULE_TAG = "FLIPPER_MODULE_TAG"

val flipperModule = Kodein.Module(FLIPPER_MODULE_TAG) {
    bind<NetworkFlipperPlugin>() with singleton {
        NetworkFlipperPlugin()
    }

    bind<FlipperClient>() with singleton {
        val networkFlipperPlugin: NetworkFlipperPlugin = instance()
        val client: FlipperClient = AndroidFlipperClient.getInstance(INSTANCE.baseContext)
        val inspectorFlipperPlugin =
            InspectorFlipperPlugin(INSTANCE, DescriptorMapping.withDefaults())
        client.addPlugin(networkFlipperPlugin)
        client.addPlugin(inspectorFlipperPlugin)
        client
    }

    bind<HttpClient>() with singleton {
        val logging = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
        val networkFlipperPlugin: NetworkFlipperPlugin = instance()
        val okHttpClientInstance = OkHttpClient.Builder().addNetworkInterceptor(FlipperOkhttpInterceptor(networkFlipperPlugin)).build()

        val httpClient = HttpClient(OkHttp) {
            engine {
                addInterceptor(logging)
                preconfigured = okHttpClientInstance
            }
        }
        httpClient
    }
}

问题是

val networkFlipperPlugin: NetworkFlipperPlugin = instance()

总是返回一个新实例而不是一个单例(实际上我所有的单例在我每次检索它们时都会返回一个新实例)

这方面有什么线索吗?非常感谢!

【问题讨论】:

  • 很奇怪。你如何检索你的绑定?
  • 发现问题了!干杯

标签: android kodein


【解决方案1】:

我在我的活动中忽略了一段代码:

 override val kodein: Kodein by retainedKodein {
        extend(parentKodein, copy = Copy.All)
    }

正如我所说,我是 Kodein 的新手 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2023-03-08
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多