Отправить данные режима просмотра в другой фрагмент, имеющий адаптер списка - PullRequest
0 голосов
/ 19 июня 2020

У меня есть два фрагмента. Одно действие, которое идеально подходит, я использую 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
}

}

...