Android 使用DataStore的委托方式实现数据存储

111 阅读1分钟

Android 使用DataStore的委托方式实现数据存储

通过kotlin的委托方式来简化使用DataStore,让我们可以直接对属性进行get或set值以读取和保存数据。

第一步,需要倒入DataStore依赖:
implementation ("androidx.datastore:datastore-preferences:1.0.0")  
implementation ("androidx.datastore:datastore:1.0.0")
第二步,创建一个接口,再创建一个类继承ReadWriteProperty:
interface IDataStore

class DataStoreProperty<V>(  
    private val decode: (String) -> V,  
    private val encode: Pair<String, V>.() -> Unit,  
    var key: String? = null  
) : ReadWriteProperty<IDataStore, V> {  
    override fun getValue(thisRef: IDataStore, property: KProperty<*>): V =  
        decode(key ?: property.name)  
  
  
    override fun setValue(thisRef: IDataStore, property: KProperty<*>, value: V) {  
        encode((key ?: property.name) to value)  
    }  
}
第三步,我们创建一个公用的getDs和setDs用于读取和保存DataStore数据:
inline fun <reified T> IDataStore.getDs(  
    crossinline decode: () -> Preferences.Key<T>,  
    default: T  
): T {  
    var value: T? = null  
    runBlocking {  
        App.mContext.dataStore.data.first {  
            value = it[decode()] ?: default  
            true  
        }  
    }  
    return value ?: default  
}  
  
fun IDataStore.setDs(encode: (setting: MutablePreferences) -> Unit) {  
    runBlocking {  
        App.mContext.dataStore.edit {  
            encode(it)  
        }  
    }  
}
第四步,创建基本类型的扩展方法:
fun IDataStore.dsInt(default: Int = 0) =  
    DataStoreProperty(  
        { getDs({ intPreferencesKey(it) }, default) },  
        { setDs { it[intPreferencesKey(first)] = second } })  
  
fun IDataStore.dsLong(default: Long = 0L) =  
    DataStoreProperty(  
        { getDs({ longPreferencesKey(it) }, default) },  
        { setDs { it[longPreferencesKey(first)] = second } })  
  
fun IDataStore.dsBool(default: Boolean = false) =  
    DataStoreProperty(  
        { getDs({ booleanPreferencesKey(it) }, default) },  
        { setDs { it[booleanPreferencesKey(first)] = second } })  
  
fun IDataStore.dsFloat(default: Float = 0f) =  
    DataStoreProperty(  
        { getDs({ floatPreferencesKey(it) }, default) },  
        { setDs { it[floatPreferencesKey(first)] = second } })  
  
fun IDataStore.dsDouble(default: Double = 0.0) =  
    DataStoreProperty(  
        { getDs({ doublePreferencesKey(it) }, default) },  
        { setDs { it[doublePreferencesKey(first)] = second } })  
  
fun IDataStore.dsString(default: String = "") =  
    DataStoreProperty(  
        { getDs({ stringPreferencesKey(it) }, default) },  
        { setDs { it[stringPreferencesKey(first)] = second } })  
  
fun IDataStore.dsStringSet(default: Set<String> = setOf()) =  
    DataStoreProperty(  
        { getDs({ stringSetPreferencesKey(it) }, default) },  
        { setDs { it[stringSetPreferencesKey(first)] = second } })
最后,就是如何使用了,简单的列举了一个方法如下:
//创建一个类继承 IDataStore
object DS : IDataStore {  
  
    var isPrivate by dsBool(false)
}

//在需要获取值的地方调用
 DS.isPrivate
 
 //保存数据的话可以直接赋值即可
 DS.isPrivate = true

还有一些保存和读取Parcelable的数据就不列举了

一起学习天天向上