kosi-libs / Kodein

Painless Kotlin Dependency Injection

Home Page:https://kosi-libs.org/kodein

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

How to provide disable Kodein shared preferences module

daniel-waiguru opened this issue · comments

I am working on a project with the android module enabled import(androidXModule(this)) but I need to provide a new secure SharedPreferences implementation without removing import(androidXModule(this)) how do I disable the sharedpreference only from the androidx module?

You cannot disable part of a module. However, you can override it.

Overriding it throws an exception.
Caused by: org.kodein.di.Kodein$OverridingException: Binding bind<SharedPreferences>() with ? { ? } must override an existing binding. at org.kodein.di.internal.KodeinContainerBuilderImpl.checkOverrides(KodeinContainerBuilderImpl.kt:106) at org.kodein.di.internal.KodeinContainerBuilderImpl.bind(KodeinContainerBuilderImpl.kt:115) at org.kodein.di.internal.KodeinBuilderImpl$TypeBinder.with(KodeinBuilderImpl.kt:20)

Or am I missing something?

Yeah, SharedPrefences is scoped on the Android Context, see the definition here:

bind { Provider(contextToken, generic()) { PreferenceManager.getDefaultSharedPreferences(context) } }

You probably need to do something like:

val contextToken = generic<Context>()
bind(overrides = true) { Provider(contextToken, generic()) { /* Your implementation */ } }

Or:

bind(overrides = true) { contexted<Context>().provider { /* Your implementation */ } }