val edit = context.dataStore.edit { map ->
map[keyValue] = (value as T)
}
关于key:
这里的key不是我们正常的string或者int,需要通过转换一下。
转换的类PreferencesKey已提供了以下key支持:
@JvmName("intKey")
public fun intPreferencesKey(name: String): Preferences.Key<Int> = Preferences.Key(name)
@JvmName("doubleKey")
public fun doublePreferencesKey(name: String): Preferences.Key<Double> = Preferences.Key(name)
@JvmName("stringKey")
public fun stringPreferencesKey(name: String): Preferences.Key<String> = Preferences.Key(name)
@JvmName("booleanKey")
public fun booleanPreferencesKey(name: String): Preferences.Key<Boolean> = Preferences.Key(name)
@JvmName("floatKey")
public fun floatPreferencesKey(name: String): Preferences.Key<Float> = Preferences.Key(name)
@JvmName("longKey")
public fun longPreferencesKey(name: String): Preferences.Key<Long> = Preferences.Key(name)
@JvmName("stringSetKey")
public fun stringSetPreferencesKey(name: String): Preferences.Key<Set<String>> =
Preferences.Key(name)
suspend fun <T> put(context: Context, key: String, value: Any, type: T) {
val keyValue = getKey(key, type)
val edit = context.dataStore.edit { map ->
map[keyValue] = value as T
}
}
获取数据
获取数据通过map来获取到flow,通过flow进行流转。
suspend fun <T> getValue(context: Context, key: String, type: T): Flow<Any?> {
val keyValue = getKey(key, type)
val flow = context.dataStore.data.map { map ->
map[keyValue]
}
return flow
}
如何创建Key?
第一种:为你的每种类型都加一个put个get类型
第二种:如果你觉得每种写法代码臃肿,可以通过泛型来匹配
private fun <T> getKey(key: String, type: T): Preferences.Key<T> {
var keyValue: Preferences.Key<T>? = null
val TypeValue = type.toString()
if (TypeValue.endsWith(Int::class.java.name)) {
keyValue = intPreferencesKey(key) as Preferences.Key<T>
} else if (TypeValue.endsWith(String::class.java.name)) {
keyValue = stringPreferencesKey(key) as Preferences.Key<T>
} else if (TypeValue.endsWith(Double::class.java.name)) {
keyValue = doublePreferencesKey(key) as Preferences.Key<T>
} else if (TypeValue.endsWith(Float::class.java.name)) {
keyValue = floatPreferencesKey(key) as Preferences.Key<T>
} else if (TypeValue.endsWith(Boolean::class.java.name)) {
keyValue = booleanPreferencesKey(key) as Preferences.Key<T>
} else if (TypeValue.endsWith(Long::class.java.name)) {
keyValue = longPreferencesKey(key) as Preferences.Key<T>
} else if (TypeValue.endsWith(Set::class.java.name)) {
keyValue = stringSetPreferencesKey(key) as Preferences.Key<T>
} else {
throw IllegalAccessException("key type is not support,you need check you key type!!")
}
return keyValue
}
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
"my_datastore",
produceMigrations = { it ->
listOf(SharedPreferencesMigration(it, "sp_test"))
})