使用kotlin特性简单封装SharedPreferences

使用方法

object AccountBiz{
    var username by defSP("")
    var mobil:String by defSP("mobil", "")
}
//取值
val name=AccountBiz.username
//存值
AccountBiz.username="aaaaa"

SPUtil实现

const val SPFileName = "Setting"
/**
 * 使用defSP的话key为""在SPUtil中key会赋值成变量名
 * 所以一般用这个
 */
inline fun <reified R, T> R.defSP(default: T) = defSP("", default)
/**
 * 指定key用这个
 */
inline fun <reified R, T> R.defSP(key: String, default: T) = SPUtil(key, default, R::class.java.name)

class SPUtil<T>(val key: String, val defValue: T, val fileName: String = SPFileName) : ReadWriteProperty<Any?, T> {
    val sp by lazy {
        appContext.getSharedPreferences(fileName, Context.MODE_PRIVATE)
    }

    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        val temKey = if (key.isEmpty()) property.name else key
        return when (defValue) {
            is String -> sp.getString(temKey, defValue)
            is Boolean -> sp.getBoolean(temKey, defValue)
            is Int -> sp.getInt(temKey, defValue)
            is Float -> sp.getFloat(temKey, defValue)
            is Long -> sp.getLong(temKey, defValue)
            else -> throw IllegalArgumentException("类型错误")
        } as T
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        val temKey = if (key.isEmpty()) property.name else key
        with(sp.edit()) {
            when (value) {
                is String -> putString(temKey, value)
                is Boolean -> putBoolean(temKey, value)
                is Int -> putInt(temKey, value)
                is Float -> putFloat(temKey, value)
                is Long -> putLong(temKey, value)
                else -> throw IllegalArgumentException("类型错误")
            }
            commit()
        }
    }
}

fun cleanSP(fileName: String = SPFileName) {
    appContext.getSharedPreferences(fileName, Context.MODE_PRIVATE).edit().clear().commit()
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一个完整的销售流程包括四个阶段:开场、调查(发现客户需求)、能力展示(展示你有能力满足客户的需求),以及获得客户承...
    旅行邦mikle阅读 610评论 0 0
  • 由于项目中嵌套html5页面的需求越来越多,大家通常会使用android自带webview,这对于一些简单的页面没...
    MardaWang阅读 5,094评论 0 2
  • 说实话 幺儿断了奶之后 我抽烟的频率是越来越大了 真的发现一心烦 心情不好 就会依赖上香烟这种东西 每天孩子的吃喝...
    Xiaoruinxx阅读 886评论 0 0
  • 一 假期的意义对于我们来说,无非就是在熟悉的老地方陪伴父母和好友相聚。这似乎成了外出求学以来的固定形式。但今年的端...
    夏筠若阅读 295评论 0 0