J'utilise une bibliothèque de pagination pour récupérer des données d'une API et les montrer dans une liste
à cette fin dans mon référentiel, j'ai créé la méthode:
fun getArticleList(query: String): Flow<PagingData<ArticleHeaderData>>
dans mon point de vue, j'ai créé la méthode de recherche qui va quelque chose comme ceci:
override fun search(query: String) {
val lastResult = articleFlow
if (query == lastQuery && lastResult != null)
return
lastQuery = query
searchJob?.cancel()
searchJob = launch {
val newResult: Flow<PagingData<ArticleList>> = repo.getArticleList(query)
.map {
it.insertSeparators { //code to add separators }.cachedIn(this)
articleFlow = newResult
newResult.collectLatest {
articleList.postValue(it)
}
}
}
afin de tester mon point de vue, j'utilise la méthode de test PagingData.from
Pour créer un flux pour revenir de mon référentiel moqué comme si:
whenever(repo.getArticleList(query)).thenReturn(flowOf(PagingData.from(articles)))
et puis je récupère les données de pagination réelles de l'articleliste Liveta As de même:
val data = vm.articleList.value!!
cela renvoie un objet PagingData<ArticleList>
que je souhaiterais vérifier qu'il contient les données du service (c'est-à-dire le articles
renvoyé à chaque fois)
la seule façon dont j'ai trouvé cela consiste à créer la fonction d'extension suivante:
private val dcb = object : DifferCallback {
override fun onChanged(position: Int, count: Int) {}
override fun onInserted(position: Int, count: Int) {}
override fun onRemoved(position: Int, count: Int) {}
}
suspend fun <T : Any> PagingData<T>.collectData(): List<T> {
val items = mutableListOf<T>()
val dif = object : PagingDataDiffer<T>(dcb, TestDispatchers.Immediate) {
override suspend fun presentNewList(previousList: NullPaddedList<T>, newList: NullPaddedList<T>, newCombinedLoadStates: CombinedLoadStates, lastAccessedIndex: Int): Int? {
for (idx in 0 until newList.size)
items.add(newList.getFromStorage(idx))
return null
}
}
dif.collectFrom(this)
return items
}
qui semble fonctionner, mais est basé sur la classe PagingDataDiffer
qui est marquée comme @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
afin de ne pas fonctionner à l'avenir
y a-t-il un meilleur moyen d'obtenir le flow
à partir de PagingData (marqué comme interne dans la bibliothèque) ou obtenez-en des données réelles?
Cela ne fonctionne que lorsqu'il y a une connexion Internet active.