【发布时间】:2021-04-09 12:41:24
【问题描述】:
SharedPreferences 提供以下函数来检索字符串:
String getString(String key, @Nullable String defValue);
存储 Int 时,默认值不可为空:
int getInt(String key, int defValue);
我现在正在寻找存储和检索可为空的Int?,例如:
var timerDuration: Int?
get() = prefs.getIntOrNull(TIMER_DURATION)
set(value) { prefs.edit { putIntOrNull(TIMER_DURATION, value) } }
解决方案一:当value为null时,移除key
private fun SharedPreferences.getIntOrNull(key: String) =
if (prefs.contains(key)) {
getInt(key, 12345)
} else {
null
}
private fun SharedPreferences.Editor.putIntOrNull(key: String, value: Int?) =
if (value == null) {
remove(key)
} else {
putInt(key, value)
}
...但我不确定由于共享首选项的异步特性,我是否会遇到多个快速访问的问题?
解决方案 2:对所有内容都使用字符串选项:
private fun SharedPreferences.getIntOrNull(key: String) =
prefs.getString(key, null)?.toIntOrNull()
private fun SharedPreferences.Editor.putIntOrNull(key: String, value: Int?) =
putString(key, value?.toString())
...但是.toIntOrNull() 感觉这样一个简单的任务需要很多开销?
我为什么要这样做?
我希望 Kotlin Multiplattform 允许我将 iOS 版本添加到我现有的 Android 应用程序中。 我的目标是完全用 Kotlin 编写的“核心”模块,没有特定于平台的依赖项。 “核心”则只使用这个接口,由 Android & iOS - Apps 实现
interface SettingsStorage {
var timerDuration: Int?
[...]
}
因为我不希望有重复的默认值逻辑我喜欢在我的“核心”模块中处理它
还有其他(更好的)选择吗?我觉得我在重新发明轮子......
【问题讨论】:
标签: android kotlin kotlin-multiplatform-mobile