Muh*_*utt 4 android dependency-injection android-contentprovider koin
面临的问题在 AppModule 中插入 ContentProvider。
\n\n我的应用程序级别模块是
\n\nmodule {\n single { TinyDB.getInstance(get()) }\n single { DataRepository(get()) }\n viewModel { HomeViewModel(get()) }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道如何在模块中使用 ContentProvider
\n\n我已经尝试过代码
\n\nval dataRepo = inject(DataRepository::class.java) \nRun Code Online (Sandbox Code Playgroud)\n\n这在我的内容提供程序中,但在此之后我的应用程序启动崩溃\n并且 logcat 显示错误按摩
\n\n java.lang.RuntimeException: Unable to get provider wastickerapps.newemojistickers.stickersforwhatsapp.whatsappUsages.StickerContentProvider: java.lang.IllegalStateException: StandAloneContext Koin instance is null\n at android.app.ActivityThread.installProvider(ActivityThread.java:5562)\n at android.app.ActivityThread.installContentProviders(ActivityThread.java:5154)\n at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5094)\n at android.app.ActivityThread.access$1600(ActivityThread.java:177)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1509)\n at android.os.Handler.dispatchMessage(Handler.java:102)\n at android.os.Looper.loop(Looper.java:145)\n at android.app.ActivityThread.main(ActivityThread.java:5942)\n at java.lang.reflect.Method.invoke(Native Method)\n at java.lang.reflect.Method.invoke(Method.java:372)\n at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)\n Caused by: java.lang.IllegalStateException: StandAloneContext Koin instance is null\n at org.koin.standalone.StandAloneContext.getKoin(StandAloneContext.kt:68)\n at org.koin.standalone.KoinComponentKt.getKoinContext(KoinComponent.kt:42)\n at org.koin.standalone.KoinComponentKt.access$getKoinContext(KoinComponent.kt:1)\n at org.koin.standalone.KoinComponent$DefaultImpls.getKoin(KoinComponent.kt:36)\n at wastickerapps.newemojistickers.stickersforwhatsapp.whatsappUsages.StickerContentProvider.getKoin(StickerContentProvider.kt:27)\n at wastickerapps.newemojistickers.stickersforwhatsapp.whatsappUsages.StickerContentProvider.<init>(StickerContentProvider.kt:481)\n at java.lang.reflect.Constructor.newInstance(Native Method)\n at java.lang.Class.newInstance(Class.java:1650)\n at android.app.ActivityThread.installProvider(ActivityThread.java:5547)\n at android.app.ActivityThread.installContentProviders(ActivityThread.java:5154)\xc2\xa0\n at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5094)\xc2\xa0\n at android.app.ActivityThread.access$1600(ActivityThread.java:177)\xc2\xa0\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1509)\xc2\xa0\n at android.os.Handler.dispatchMessage(Handler.java:102)\xc2\xa0\n at android.os.Looper.loop(Looper.java:145)\xc2\xa0\n at android.app.ActivityThread.main(ActivityThread.java:5942)\xc2\xa0\n at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n at java.lang.reflect.Method.invoke(Method.java:372)\xc2\xa0\n at \nRun Code Online (Sandbox Code Playgroud)\n
内容提供者初始化在Application()类中的onCreate()方法之前,我从Application()类中的attachBaseContext()方法调用了startKoin,在我的ContentProvider类中实现KoinComponent,并使用此在ContentProvider中注入数据存储库
var dataRepo = inject<DataRepository>()
Run Code Online (Sandbox Code Playgroud)
这是注入的代码
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)
Run Code Online (Sandbox Code Playgroud)