是否可以缩短数据存储首选项的代码
Is it possible to shorten the code for the DataStore Preferences
问题 - 使用 DataStore Preferences 和 Kotlin Flow 时重复一段代码。
我在说什么:
override fun readSomeData(): Flow<String> {
return dataStore.data
.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
.map { preferences ->
preferences[PreferencesKey.someValue] ?: "null value"
}
}
是否可以将 .catch { exception } 中的功能放在单独的函数中,并能够更改 Kotlin Flow?
您可以在 FlowCollector
类型上创建一个 suspend
扩展函数并重新使用它:
suspend fun FlowCollector<Preferences>.onCatch(exception: Throwable) {
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
fun readSomeData(): Flow<String> {
return flow<String>{}
.catch {
onCatch(it)
}.map { preferences ->
preferences[PreferencesKey.someValue] ?: "null value"
}
}
或者如果您想重用整个 catch
语句,您可以在 Flow
上创建一个扩展函数:
fun Flow<Preferences>.onCatch() = catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
fun readSomeData(): Flow<String> {
return flow<String> {}
.onCatch()
.map { preferences ->
preferences[PreferencesKey.someValue] ?: "null value"
}
}
问题 - 使用 DataStore Preferences 和 Kotlin Flow 时重复一段代码。
我在说什么:
override fun readSomeData(): Flow<String> {
return dataStore.data
.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
.map { preferences ->
preferences[PreferencesKey.someValue] ?: "null value"
}
}
是否可以将 .catch { exception } 中的功能放在单独的函数中,并能够更改 Kotlin Flow?
您可以在 FlowCollector
类型上创建一个 suspend
扩展函数并重新使用它:
suspend fun FlowCollector<Preferences>.onCatch(exception: Throwable) {
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
fun readSomeData(): Flow<String> {
return flow<String>{}
.catch {
onCatch(it)
}.map { preferences ->
preferences[PreferencesKey.someValue] ?: "null value"
}
}
或者如果您想重用整个 catch
语句,您可以在 Flow
上创建一个扩展函数:
fun Flow<Preferences>.onCatch() = catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
fun readSomeData(): Flow<String> {
return flow<String> {}
.onCatch()
.map { preferences ->
preferences[PreferencesKey.someValue] ?: "null value"
}
}