我最近了解了Koin。 我试图将当前的项目从Dagger迁移到Koin。 为此,我在向活动中注入 sharedPreferences和sharedPreferences编辑器时遇到了问题。
以下是我在 Dagger 中用于注入sharedPreferences和sharedPreferences编辑器->
的代码import { NativeScriptModule } from "nativescript-angular/nativescript.module";
// Module declaration, not important
imports = [
// Other imports
NativeScriptModule
],
我试图将上述代码转换为 Koin --
@Provides
@AppScope
fun getSharedPreferences(context: Context): SharedPreferences =
context.getSharedPreferences("default", Context.MODE_PRIVATE)
@SuppressLint("CommitPrefEdits")
@Provides
@AppScope
fun getSharedPrefrencesEditor(context: Context): SharedPreferences.Editor =
getSharedPreferences(context).edit()
我也尝试过这种方式->
val appModule = module {
val ctx by lazy{ androidApplication() }
single {
ctx.getSharedPreferences("default", Context.MODE_PRIVATE)
}
single {
getSharedPreferences(ctx).edit()
}
}
现在,我将这样的依赖项注入到我的活动中->
val appModule = module {
single {
androidApplication().getSharedPreferences("default", Context.MODE_PRIVATE)
}
single {
getSharedPreferences(androidApplication()).edit()
}
}
但是,一旦启动我的应用程序并尝试使用它们,我就无法读取或写入任何与首选项有关的内容。
我对代码有什么问题感到困惑。 请帮我解决这个问题。
答案 0 :(得分:1)
尝试一下;
val appModule = module {
single {
androidApplication().getSharedPreferences("default", Context.MODE_PRIVATE) as SharedPreferences
}
single {
getSharedPreferences(androidApplication()).edit() as SharedPreferences.Editor
}
}
答案 1 :(得分:1)
我想出了一种解决方法。 希望这可以帮助寻找相同问题的人。
这是解决问题的方法:
koin模块的定义将如下所示->
val appModule = module {
single{
getSharedPrefs(androidApplication())
}
single<SharedPreferences.Editor> {
getSharedPrefs(androidApplication()).edit()
}
}
fun getSharedPrefs(androidApplication: Application): SharedPreferences{
return androidApplication.getSharedPreferences("default", android.content.Context.MODE_PRIVATE)
}
请注意,以上代码位于文件 modules.kt
中现在您可以轻松注入创建的实例,例如->
private val sharedPreferences: SharedPreferences by inject()
private val sharedPreferencesEditor: SharedPreferences.Editor by inject()
确保上述实例是 val 而不是 var ,否则inject()方法将不起作用,因为这是惰性注入。