Source structure
app\
—— java\
————- [package name]\
———————- AppApplication.kt
———————- repository\
——————————- UserPreferenceRepository.kt
——————————- RepositoryModule.kt
Create “RepositoryModule.kt”
import android.content.Context import org.koin.android.ext.koin.androidApplication import org.koin.dsl.module.module val repositoryModule = module { single { UserPreferenceRepository() } single("userPreferences") { androidApplication().getSharedPreferences("userPreferences", Context.MODE_PRIVATE) } }
Create “UserPreferenceRepository.kt”
import android.content.SharedPreferences import org.koin.standalone.KoinComponent import org.koin.standalone.inject class UserPreferenceRepository : KoinComponent { private val preferences: SharedPreferences by inject("userPreferences") companion object { private const val LOGGED_IN_USER_NAME = "user_name" private const val IS_ADMIN_USER_ = "is_admin_user" } var loggedInUserName: String get() = preferences.getString(LOGGED_IN_USER_NAME, "") ?: "" set(userName) = preferences.edit().putString(LOGGED_IN_USER_NAME, userName).apply() var isAdminUser: Boolean get() = preferences.getBoolean(IS_ADMIN_USER_, false) set(isAdmin) = preferences.edit().putBoolean(IS_ADMIN_USER_, isAdmin).apply() }
Declare Koin module into “AppApplication.kt”
class AppApplication : Application(), LifecycleObserver { override fun onCreate() { super.onCreate() ProcessLifecycleOwner.get().lifecycle.addObserver(this) //Initialze Koin initKoin() } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onComingToForgeround() { //Initialize something here } private fun initKoin() { startKoin( this, listOf( repositoryModule ) ) } }
Not really clear why you wrapped creating SharedPreferences outside repository inside module 😕
why not to use this design :
import android.content.Context
import android.content.SharedPreferences
class UserPreferences(val context: Context) {
private val preferences: SharedPreferences =
context.getSharedPreferences(“userPreferences”, Context.MODE_PRIVATE)
var loggedInUserName: String
get() = preferences.getString(LOGGED_IN_USER_NAME, “”) ?: “”
set(userName) = preferences.edit().putString(LOGGED_IN_USER_NAME, userName).apply()
var isAdminUser: Boolean
get() = preferences.getBoolean(IS_ADMIN_USER_, false)
set(isAdmin) = preferences.edit().putBoolean(IS_ADMIN_USER_, isAdmin).apply()
companion object {
private const val LOGGED_IN_USER_NAME = “user_name”
private const val IS_ADMIN_USER_ = “is_admin_user”
}
}
And module:
val storageModule = module {
single { UserPreferences(get()) }
}