首先,让我们创建通用接口来提供以下实例SharedPreferences:
interface SharedPreferencesProvider {
    val sharedPreferences: SharedPreferences
}
在我们必须为将读取/写入首选项值的属性创建委托之后:
object PreferencesDelegates {
    fun string(
        defaultValue: String = "",
        key: String? = null
    ): ReadWriteProperty<SharedPreferencesProvider, String> = 
        StringPreferencesProperty(defaultValue, key)
}
private class StringPreferencesProperty(
    private val defaultValue: String,
    private val key: String?
) : ReadWriteProperty<SharedPreferencesProvider, String> {
    override fun getValue(
         thisRef: SharedPreferencesProvider, 
         property: KProperty<*>
    ): String {
        val key = key ?: property.name
        return thisRef.sharedPreferences.getString(key, defaultValue)
    }
    override fun setValue(
        thisRef: SharedPreferencesProvider,
        property: KProperty<*>, 
        value: String
    ) {
        val key = key ?: property.name
        thisRef.sharedPreferences.save(key, value)
    }
}
PreferencesDelegates需要隐藏实现并为代码添加一些可读性。最后它可以像这样使用:
class AccountRepository(
    override val sharedPreferences: SharedPreferences
) : SharedPreferencesProvider {
    var currentUserId by PreferencesDelegates.string()
    var currentUserName by string() //With import
    var currentUserNickname by string(key = "CUSTOM_KEY", defaultValue = "Unknown")
    fun saveUser(id: String, name: String) {
        this.currentUserId = id
        this.currentUserName = name
    }
}
可以实现类似int的,float甚至可以自定义类型:
open class CustomPreferencesProperty<T>(
    defaultValue: T,
    private val key: String?,
    private val getMapper: (String) -> T,
    private val setMapper: (T) -> String = { it.toString() }
) : ReadWriteProperty<SharedPreferencesProvider, T> {
    private val defaultValueRaw: String = setMapper(defaultValue)
    override fun getValue(
        thisRef: SharedPreferencesProvider, 
        property: KProperty<*>
    ): T {
        val key = property.name
        return getMapper(thisRef.sharedPreferences.getString(key, defaultValueRaw))
    }
    override fun setValue(
        thisRef: SharedPreferencesProvider, 
        property: KProperty<*>, 
        value: T
    ) {
        val key = property.name
        thisRef.sharedPreferences.save(key, setMapper(value))
    }
}
我写了涵盖这种情况的小型图书馆。您可以在此处找到其余已实施的首选项
编辑。如果您使用匕首:
class AccountRepository @Injcet constructor() : SharedPreferencesProvider {
    @Inject
    override lateinit var sharedPreferences: SharedPreferences
    var currentUserId by PreferencesDelegates.string()
    ...
}