Проблемы с добавлением sharedPreferences и sharedPrefrencesEditor в модуль Koin

Я недавно узнал о Коине. Я пытался перенести свой текущий проект с Dagger на Koin. При этом я столкнулся с проблемой внедрения sharedPreferences и редактора sharedPreferences в действия.

Ниже приведен код, который я использовал в Dagger для внедрения редактора sharedPreferences и sharedPreferences ->

    @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()

Я попытался преобразовать вышеупомянутый код в Koin вот так ->

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()
        }
    }

Теперь я ввожу зависимости в свою деятельность следующим образом ->

val sharedPreferences: SharedPreferences by inject()

val sharedPreferencesEditor: SharedPreferences.Editor by inject()

Но как только я запускаю свое приложение и пытаюсь использовать их, я не могу ничего читать или писать в настройках.

Я немного запутался в том, что не так с кодом. Пожалуйста, помогите мне разобраться в этом.


person Annsh Singh    schedule 17.01.2019    source источник


Ответы (1)


Я придумал, как с этим справиться. Надеюсь, это поможет кому-то, кто ищет ту же проблему.

Вот решение проблемы:

Определение модуля коина будет таким ->

 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 () не будет работать, поскольку это ленивая инъекция.

person Annsh Singh    schedule 28.01.2019
comment
Действительно ли жесткое кодирование слова по умолчанию дает значение SharedPreference по умолчанию? - person Richard Miller; 04.12.2019
comment
я получаю ошибку Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for 'android.content.SharedPreferences' has been found. Check your module definitions - person Shvet; 29.07.2020