如何在视图模型中从数据存储首选项(如Flow)获取值



我有一个情况,我得到解决与SharedPreferences。但是现在我正在迁移到kotlin和DataStore。

我遇到了这个问题。

我有一个String值存储在共享首选项中,以及其他键值对。这个字符串是一个URL,在Retrofit调用的baseUrl参数中使用。

我的问题是什么是正确的方式来检索值,当我在一个ViewModel,片段运行。

这是我代码的一部分:

@Singleton
class PreferencesManager @Inject constructor(
@ApplicationContext context: Context,
anioDao: AnioDao
) {
val baseUrlFlow = dataStore.data
.catch { exception ->
if (exception is IOException) {
Log.e(TAG, "Error reading preferences: ", exception)
emit(emptyPreferences())
} else {
throw exception
}
}
.map {
it[PreferencesKeys.BASER_URL] ?: "http://192.168.2.109:1337"
}
}

then in ViewModel class

class EnsayosViewModel @ViewModelInject constructor(
private val ensayoRepository: EnsayoRepository,
private val anioRepository: AnioRepository,
private val localidadRepository: LocalidadRepository,
private val epocaRepository: EpocaRepository,
private val preferencesManager: PreferencesManager,
private val agrotrackerApi: AgrotrackerApi,
@Assisted private val state: SavedStateHandle
) :
ViewModel() {
...
//Base Url
val baseUrlFlow = preferencesManager.baseUrlFlow
private val _baseUrl = MutableLiveData<String>()
private fun getBaseUrl() {
viewModelScope.launch {
baseUrlFlow.flowOn(Dispatchers.IO).collect{
_baseUrl.value = it
}
}
}
...
fun fetchEsayosFromAT() {
//This is where I want to get value of the base_url key.
}

但是对于一个简单的任务来说,它似乎非常复杂……

我错过了什么?我真的迷路了。

问好

获取共享首选项数据的一种方法是将Flow转换为LiveData。它工作得很好,但它很可能被StateFlow/SharedFlow作为首选方法所取代。

  1. 在返回Flow的首选项存储库中创建一个方法

    override fun getBaseUrlPreferencesFlow(): Flow<String> = context.dataStore.data
    .catch { exception ->
    if (exception is IOException) {
    Log.e(TAG, "Error reading preferences: ", exception)
    emit(emptyPreferences())
    } else {
    throw exception
    }
    }
    .map { pref ->
    it[PreferencesKeys.BASER_URL] ?: "http://192.168.2.109:1337"
    }
    
  2. 在你的ViewModel中初始化LiveData,如下所示(你可以从ViewModel或Fragment访问它)

    val baseUrlLiveData: LiveData<String> = 
    yourInjectedRepository.getBaseUrlPreferencesFlow().asLiveData()
    
  3. (可选)在ViewModel中-添加辅助方法来处理基础url

    private fun processUrl(): String {
    viewModelScope.launch {
    // base url http://192.168.2.109:1337
    val url = baseUrlLiveData.value 
    }         
    }
    

相关内容

  • 没有找到相关文章

最新更新