在向Koin模块添加sharedPreferences和sharedPrefrencesEditor时遇到的问题

时间:2019-01-17 11:47:43

标签: dependency-injection koin

我最近了解了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()
        }
    }

但是,一旦启动我的应用程序并尝试使用它们,我就无法读取或写入任何与首选项有关的内容。

我对代码有什么问题感到困惑。 请帮我解决这个问题。

2 个答案:

答案 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()方法将不起作用,因为这是惰性注入。