0

SharedPreferences で解決される状況があります。しかし今、私は kotlin と DataStore に移行しています。

私はこの問題に直面しました。

他のキーと値のペアの中で、共有設定に格納されている文字列値があります。この文字列は、Retrofit 呼び出しの baseUrl パラメータで使用する URL です。

私の問題は、ViewModel で実行しているときに Fragment の値を取得する正しい方法は何かということです。

これは私のコードの一部です:

@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"
        }

}

次にViewModelクラスで

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.

}

しかし、単純なタスクの場合、非常に複雑なようです...

私は何が欠けていますか?私は本当に迷っています。

よろしくお願いします

4

1 に答える 1