是否可以缩短数据存储首选项的代码

Is it possible to shorten the code for the DataStore Preferences

问题 - 使用 DataStore PreferencesKotlin 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"
        }
}