【问题标题】:Emit Article with title Kotlin Flow发出标题为 Kotlin Flow 的文章
【发布时间】:2022-09-27 18:47:45
【问题描述】:

我的任务是从 RecyclerView 获取带有提供标题的整篇文章。 当我单击特定文章时,我会从中获得标题。

房间数据库:

  @Query(\"SELECT * FROM article_table WHERE title = :title\")
  fun getArticleDetails(title: String): Flow<ArticleLocal>

存储库:

fun getArticleDetails(title: String): Flow<ArticleLocal> {
    return articleDao.getArticleDetails(title)
}

视图模型:

val articleDetail = MutableStateFlow<ArticleLocal>(ArticleLocal(\"\",\"\",\"\",\"\",\"\"))
fun getArticle(title: String) {
        viewModelScope.launch {
            articleRepository.getArticleDetails(title).collect {
                articleDetail.emit(it)
            }
        }
}

主要活动:

lifecycleScope.launch {
     viewModel.getArticle(title)
     viewModel.articleDetail.collect {
           Log.d(TAG, \"onCreate: $it\")
     }
}

这段代码的问题是第一次接触时 articleDetail 给了我空的 ArticleLocal 例如title = \"\" 我在 ViewModel 中定义的,后来我得到了很好的结果。

    标签: android kotlin android-room kotlin-coroutines kotlin-flow


    【解决方案1】:

    使用 SharedFlow,这样它就不必发布默认结果。流在接收到第一个值之前不会发出任何内容。使用 replay = 1 获得与 StateFlow 类似的行为,只要新订阅者立即获得最新值。

    您还需要考虑,如果标题发生更改,则不应保留旧标题的发布值。目前,每次标题更改时,您都可以从越来越多的流中收集它。

    如果您只为标题使用另一个 MutableSharedFlow,您可以让它自动取消对那些旧标题流的不必要收集。它还允许您获得 SharingStarted.WhileSubscribed 的好处,以避免在没有订阅者时从存储库中进行不必要的收集。

    在视图模型中:

    private val articleTitle = MutableSharedFlow<String>(bufferOverflow = BufferOverflow.DROP_OLDEST)
    
    val articleDetail = articleTitle.flatMapLatest { articleRepository.getArticleDetails(it) }
        .shareIn(viewModelScope, SharingStarted.WhileSubscribed(5000), replay = 1)
    
    fun getArticle(title: String) {
        articleTitle.tryEmit(title)
    }
    

    【讨论】:

    • 存在不匹配。必需:找到 Int:ArticleTitle 中的 BufferOverflow
    • 抱歉,为缓冲区溢出使用命名参数。
    【解决方案2】:

    您可以摆脱额外的流来发出数据并直接使用从存储库返回的流。

    视图模型:

    fun getArticle(title: String): Flow<ArticleLocal> {
        return articleRepository.getArticleDetails(title)
    }
    

    主要活动:

    lifecycleScope.launch {
        viewModel.getArticle(title).collect {
            Log.d(TAG, "onCreate: $it")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 2022-01-02
      • 1970-01-01
      • 2020-09-30
      • 2022-11-11
      • 2010-09-21
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多