【问题标题】:Mapping to Flow and using it as a List<Item>映射到 Flow 并将其用作 List<Item>
【发布时间】:2022-11-10 12:57:29
【问题描述】:

我正在使用改造并从新闻 api 中获取数据。 我想使用流,所以我在存储库中执行此操作:

  fun getTopArticles(): Flow<List<Article>> {
        return flow {
            val topArticles = apiService.getTopHeadlinesArticles().articles
                .map { article ->
                    Article(
                        title = article.title,
                        content = article.content
                    )
                }
            emit(topArticles)
        }.flowOn(Dispatchers.IO)
    }

视图模型:

private val _observeTopArticles = MutableStateFlow(emptyList<Article>())
    val observeTopArticles = _observeTopArticles.asStateFlow()

  init {
        viewModelScope.launch {
            articleRepository.getTopArticles()
                .collect{
                    _observeTopArticles.value = it
                }
        }
    }

活动:

lifecycleScope.launch{
    viewModel.observeTopArticles.collect{
        if (it.isNotEmpty()){
        }
    }
}

我想得到这样的东西:

[Article(I know something, some content)] etc.

但我明白了:

[android.newz.domain.Article@5f612be, android.newz.domain.Article@700f1f]

我想在 RecyclerView 中使用它。

【问题讨论】:

  • 顺便说一句,如果您只返回一个项目,为什么还要使用流程?您是否计划将来返回多个列表?如果没有,则使用常规挂起函数而不是流。您的代码将更简单、更清晰。
  • 目前我只返回 1 个列表,但我正在使用它,因为我需要搜索它的内容和标题。不确定这是否是一个好习惯。

标签: android kotlin retrofit kotlin-flow


【解决方案1】:

我认为您的Flow 代码很好。看起来问题是 Article 没有 toString() 实现,所以你只是看到默认的字符串表示。尝试将Article 变成data class

【讨论】:

  • 天哪,我忘记了数据类文章,谢谢<3
猜你喜欢
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2022-07-26
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多