站在大佬的肩膀上,参考了大佬的 MMKV-KTX 感谢大佬
1、结合了 Kotlin 属性委托的特性,使用field属性名作为缓存key,无需声明大量的键名常量
2、支持多套环境维护,互相切换,互不影响
3、支持任意对象缓存,需要自定义序列化,SerializableCoder,GsonCoder开箱即用,可自定义其他coder
store为真正的缓存实现,默认的实现有
SpImpl 作为SharedPreferences的实现
MMkvImpl 作为 MMKV 实现(推荐使用)
如果都不满足您的需求,您也可以自定义实现IStore即可
在根目录的 build.gradle
添加:
allprojects {
repositories {
//...
maven { url 'https://www.jitpack.io' }
}
}
在模块的 build.gradle
添加依赖:
dependencies {
implementation 'com.github.mtzqc:kv-ktx:1.0.0'
//如果使用mmkv,不使用可以不引入
implementation 'com.tencent:tencent:xxxx'
}
让一个类继承KVOwner
即可在该类使用 by kvXXX()
函数将属性委托给 Store
,例如:
object GlobalSetting : KVOwner({
MMkvImpl()
}) {
var isLogin by kvBool()
var loginUser by kvCoder<UserInfo>()
}
如果已经有了父类继承不了,那就实现 IKVOwner by KVOwner
,比如:
class BySetting: UnBase(),IKVOwner by KVOwner({
MMkvImpl()
}) {
}
支持以下类型:
函数 | 默认值 |
---|---|
kvInt() |
0 |
kvLong() |
0L |
kvBool() |
false |
kvFloat() |
0f |
kvDouble() |
0.0 |
kvStr() |
/ |
kvSet() |
/ |
kvBytes() |
/ |
kvParcelable() |
SpStore不支持 |
kvCoder() |
自定义序列化 |
如果不同IKVOwner的子类中定义了相同的字段,避免重复,务必保证AbstractOwner中的prefix唯一,或者使用不相同的store,或者appendClazz=true, 三选一
进阶用法:
环境隔离
val userA by lazy {
UserSetting("111")
}
val userB by lazy {
UserSetting("222")
}
userA.userName = "张三"
userB.userName = "李四"
asRemove()转换,可以使用null删除缓存操作,缓存删除后再次获取任然返回默认值
var gender by kvBool().asRemove()
//删除缓存
userA.gender = null
asLiveData()转换,可以使用LiveData的方式操作缓存
val time by kvLong().asRemove().asLiveData()
userA.time.value = 10L
userA.time.postValue(100L)
//删除缓存
userA.time.value = null
删除缓存
//方法1
fun removeTest(){
removeProperty(UserSetting::userName)
}
//方法2
userA.gender = null
//方法3
livedata.value = null
livedata.postValue(null)
kvCoder(),在使用前,必须先执行KvPlugins.addCoder(),如果使用时找不到对应的coder会抛异常,根据自身需求添加,也可以自定义实现,如protobuf,Fastjson
//使用
var loginUser by kvCoder<UserInfo>()
//非必须 java序列化
// KvPlugins.addCoder(SerializableCoder())
//非必须 Gson序列化,记得 implementation 'com.google.code.gson:gson:xxx'
KvPlugins.addCoder(GsonCoder())
//KvPlugins.addCoder(XXXCoder())
//KvPlugins.addCoder(XXXCoder())