Compose出来也好久了,各种remember和LocalXXX.current也是用得越来越熟。如果能在保持上述写法一致性的情况下完成数据的持久化工作,不是显得挺优雅的吗?
基于此,我写出了开源库:ComposeDataSaver: 在Jetpack Compose中优雅完成数据持久化
简单一瞥:
// booleanExample 初始化值为false
// 之后会自动读取本地数据
var booleanExample by rememberDataSaverState(KEY_BOOLEAN_EXAMPLE, false)
// 直接赋值即可完成持久化
booleanExample =
可还行?
项目有以下特点:
在settings.gradle
引入jitpack仓库位置
dependencyResolutionManagement {
repositories {
maven { url "https://jitpack.io" }
}
}
在项目build.gradle
引入
dependencies {
implementation 'com.github.FunnySaltyFish:ComposeDataSaver:v1.0.0'
}
项目使用DataSaverInterface
接口的实现类来保存数据,因此您需要先提供一个此类对象。
项目默认包含了使用Preference
保存数据的实现类DataSaverPreferences
,可如下初始化:
// init preferences
val dataSaverPreferences = DataSaverPreferences().apply {
setContext(context = applicationContext)
}
CompositionLocalProvider(LocalDataSaver provides dataSaverPreferences){
ExampleComposable()
}
此后在ExampleComposable
及其子微件内部可使用LocalDataSaver.current
获取当前实例
对于基本数据类型(如String/Int/Boolean):
// booleanExample 初始化值为false
// 之后会自动读取本地数据
var booleanExample by rememberDataSaverState(KEY_BOOLEAN_EXAMPLE, false)
// 直接赋值即可完成持久化
booleanExample = true
就这么简单!
只需要实现DataSaverInterface
类,并重写saveData
和readData
方法分别用于保存数据和读取数据
interface DataSaverInterface{
fun <T> saveData(key:String, data : T)
fun <T> readData(key: String, default : T) : T
}
然后将LocalDataSaver提供的对象更改为您自己的类实例
val dataStore = DataSaverDataStore()
CompositionLocalProvider(LocalDataSaver provides dataStore){
ExampleComposable()
}
后续相同使用即可。
默认的DataSaverPreferences
并不提供自定义类型的保存(当尝试这样做时会报错)。尽管不建议持久化实体类,但您仍可以这样做。您可以选择以下方式实现这一目标。
DataSaverInterface
实现类(见上)并实现相关的保存方法对于第二种方式,您需要为对应实体类添加转换器以实现保存时自动转换为String。方法如下:
@Serializable
data class ExampleBean(var id:Int, val label:String)
// ------------ //
// 在初始化时调用registerTypeConverters方法注册对应转换方法
// 该方法接收两个参数:实体类Class和对应的转换方法(Lambda表达式)
registerTypeConverters(ExampleBean::class.java) {
val bean = it as ExampleBean
Json.encodeToString(bean)
}
完整例子见示例项目
rememberDataSaverState
的autoSave
参数为false
,此时对象的赋值操作将不会执行持久化操作,您在需要保存的位置手动保存:LocalDataSaver.current.saveData()
阅读量:69
点赞量:0
收藏量:0