У меня есть два фрагмента. Одно действие, которое идеально подходит, я использую nav Host для перехода от 1-го фрагмента к другому. На данный момент у меня нет базы данных. Я делаю вызов в репозиторий, используя модификацию, которая возвращает результат как OutPut, который является запечатанным классом, я получил результат вызова API в первом фрагменте ViewModel, и я могу наблюдать его в первом фрагменте. Теперь, как мне отправить это во второй фрагмент или во вторую модель просмотра. какое здесь лучшее решение? Я не хочу внедрять базу данных. Я не хочу делать еще один вызов, создавая репозиторий для второй ViewModel и вызывая тот же метод. Я также хочу наблюдать за любыми изменениями в списке, которые я могу сделать с помощью DiffUtil, если я прав? Какое лучшее решение в этом случае? Ниже мой код. Как я могу отправить живые данные wordResponse во второй адаптер фрагмента, а также наблюдать изменения.
Мой репозиторий
class DictionaryRepository internal constructor(private val networkService: NetworkService) {
companion object {
@Volatile
private var dictionaryRepoInstance: DictionaryRepository? = null
fun getInstance(dictionaryService: NetworkService) =
dictionaryRepoInstance ?: synchronized(this) {
dictionaryRepoInstance
?: DictionaryRepository(dictionaryService).also { dictionaryRepoInstance = it }
}
}
/**
* Fetch a new searched word from the network
*/
suspend fun fetchRecentSearchedWord(term: CharSequence) = try {
val response = networkService.retrofitClient().makeCallForWordDefinition(term)
OutputResult.Success(response.list)
} catch (t: Throwable) {
OutputResult.Error(t)
}
}
MyViewModel
class SearchFragmentViewModel internal constructor(
private val dictionaryRepository: DictionaryRepository) : ViewModel() {
/** Show a loading spinner if true*/
private val _spinner = MutableLiveData(false)
val spinner: LiveData<Boolean> get() = _spinner
/**take the data into the result live data*/
private val _wordResponse = MutableLiveData<OutputResult>()
val wordResponse: LiveData<OutputResult> get() = _wordResponse
fun makeAPICallWithSuspendFunction(term: CharSequence) {
_spinner.value = true
viewModelScope.launch(Dispatchers.Main) {
val result = dictionaryRepository.fetchRecentSearchedWord(term)
_wordResponse.value = when (result) {
is OutputResult.Success -> {
OutputResult.Success(result.output)
}
is OutputResult.Error -> {
OutputResult.Error(result.throwable)
}
}
}
_spinner.value = false
}
}