Search code examples
androiddependency-injectionandroid-contentproviderkoin

How to inject datarepository instance in Content provider using insert-koin


Facing Issues insert ContentProvider in AppModule.

My app level Module is

module {
        single { TinyDB.getInstance(get()) }
        single { DataRepository(get()) }
        viewModel { HomeViewModel(get()) }
    }

I have no idea how to use ContentProvider in Module

I have tried Code

val dataRepo = inject(DataRepository::class.java) 

this in my Content provider but after this my app start crashes and logcat show Error Massage

    java.lang.RuntimeException: Unable to get provider wastickerapps.newemojistickers.stickersforwhatsapp.whatsappUsages.StickerContentProvider: java.lang.IllegalStateException: StandAloneContext Koin instance is null
        at android.app.ActivityThread.installProvider(ActivityThread.java:5562)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5154)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5094)
        at android.app.ActivityThread.access$1600(ActivityThread.java:177)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1509)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5942)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
     Caused by: java.lang.IllegalStateException: StandAloneContext Koin instance is null
        at org.koin.standalone.StandAloneContext.getKoin(StandAloneContext.kt:68)
        at org.koin.standalone.KoinComponentKt.getKoinContext(KoinComponent.kt:42)
        at org.koin.standalone.KoinComponentKt.access$getKoinContext(KoinComponent.kt:1)
        at org.koin.standalone.KoinComponent$DefaultImpls.getKoin(KoinComponent.kt:36)
        at wastickerapps.newemojistickers.stickersforwhatsapp.whatsappUsages.StickerContentProvider.getKoin(StickerContentProvider.kt:27)
        at wastickerapps.newemojistickers.stickersforwhatsapp.whatsappUsages.StickerContentProvider.<init>(StickerContentProvider.kt:481)
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at java.lang.Class.newInstance(Class.java:1650)
        at android.app.ActivityThread.installProvider(ActivityThread.java:5547)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5154) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5094) 
        at android.app.ActivityThread.access$1600(ActivityThread.java:177) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1509) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:145) 
        at android.app.ActivityThread.main(ActivityThread.java:5942) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at 

Solution

  • Content Provider Initialise Before onCreate() method in Application() class,I have called startKoin from attachBaseContext() method in Application() class implement KoinComponent in my ContentProvider class and inject data repository in ContentProvider using this

     var dataRepo = inject<DataRepository>()
    

    Here is the code for inject

    inline fun <reified T : Any> inject(name: String = "", scope: Scope? = 
    null, noinline parameters: ParameterDefinition = 
    emptyParameterDefinition()) = lazy { get<T>(name, scope, parameters) }
    
    inline fun <reified T : Any> get(name: String = "", scope: Scope? = 
    null, noinline parameters: ParameterDefinition = e . 
    mptyParameterDefinition()): T = getKoin().get(name, scope, parameters)
    //
    fun getKoin(): KoinContext = 
    (org.koin.standalone.StandAloneContext.koinContext as KoinContext)