实现Preferences DataStore读取通用方法 传入key返回数据异常如何解决
问题原因
- 多余的suspend修饰符:返回Flow的函数不需要标记为suspend,Flow只有在调用collect等终端操作时才需要在协程环境运行,函数本身无需挂起,多余的suspend修饰符会导致调用逻辑异常。
- 泛型返回值不匹配:当前方法返回值硬编码为
Flow<String>,但传入的Preferences.Key<T>支持String、Int、Boolean、Float、Long等多种泛型类型,类型不匹配会导致运行时转换异常,且默认值也需要和T的类型匹配。
修正后的实现代码
fun <T> getData(key: Preferences.Key<T>, defaultValue: T): Flow<T> { return context.dataStore.data .map { preferences -> preferences[key] ?: defaultValue } }
如果需要单次读取最新数据而不需要监听数据变化,可以额外补充单次读取的挂起方法:
suspend fun <T> getOnceData(key: Preferences.Key<T>, defaultValue: T): T { return context.dataStore.data.first()[key] ?: defaultValue }
使用示例
- 获取String类型数据
// 先定义对应的Key val USER_NAME = stringPreferencesKey("user_name") // 调用方法获取Flow val userNameFlow: Flow<String> = getData(USER_NAME, defaultValue = "") // 协程中收集数据 lifecycleScope.launch { userNameFlow.collect { userName -> // 处理拿到的用户名 } }
- 获取Int类型数据
val USER_AGE = intPreferencesKey("user_age") val userAgeFlow: Flow<Int> = getData(USER_AGE, defaultValue = 0)
内容的提问来源于stack exchange,提问作者karteek thati
相关产品推荐
相关产品推荐

