如何组合 2 个流以将它们的值作为参数传递给 suspend fun(哪个 returns 字符串)?

How to combine 2 Flows as to pass their values as arguments into suspend fun (which returns String)?

以前,当 ViewModel 中的“suspend fun getCategoryName(categoryNumber: Int)”函数只包含一个参数 - categoryNumber: Int 时,我曾经在 Fragment 中这样调用它:

在片段中:

viewModel.categoryNumber.observe(viewLifecycleOwner) {
        viewLifecycleOwner.lifecycleScope.launch {
            (activity as MainActivity).supportActionBar?.title = viewModel.getCategoryName(it)
        }
    }

现在我添加了第二个参数 NativeLanguage(枚举),但我不知道如何组合两个参数并将它们传递到一个方法中以在 Fragment 中启动它。 sombodyy可以帮忙吗?感谢任何帮助。

PS 我试过这样输入 somthg:

suspend fun catName(): String = combine( catNumFlow, natLangFlow ) { cN, nL ->
        Pair(cN, nL)
    }.flatMapLatest { (cN, nL) ->
        wordDao.getCategoryName(cN, nL)
    }

但这里是类型不匹配,因为 Dao 函数是一个 suspend fun 返回字符串,而 combine of 2 Flows returns Flow.

我也试着把一个观察者放到另一个观察者身上,结果很奇怪:

viewModel.readNatLang.observe(viewLifecycleOwner) { natLang ->
    viewModel.categoryNumber.observe(viewLifecycleOwner) { catNum ->
        viewLifecycleOwner.lifecycleScope.launch {
            (activity as MainActivity).supportActionBar?.title =
                viewModel.getCategoryName(catNum, natLang)
            }
        }
    }
}

在视图模型中:

val catNumFlow = preferencesManager.categoryNumberFlow // returns Flow<Int>
private val natLangFlow = preferencesManager.nativeLanguageFlow // Flow<NativeLanguage> (enum)

suspend fun getCategoryName(categoryNumber: Int, nativeLanguage: NativeLanguage) = wordDao.getCategoryName(categoryNumber, nativeLanguage)

My Dao 查询:

suspend fun getCategoryName(categoryNumber: Int, nativeLanguage: NativeLanguage) =
    if (categoryNumber != 0) {
        when (nativeLanguage) {
            NativeLanguage.RUS -> getCategoryNameRus(categoryNumber)
            NativeLanguage.ENG -> getCategoryNameEng(categoryNumber)
        }
    } else {
        when (nativeLanguage) {
            NativeLanguage.RUS -> "Все категории"
            NativeLanguage.ENG -> "All categories"
        }
    }

@Query("SELECT categoryNameRus FROM category_table WHERE categoryNumber = :categoryNumber")
suspend fun getCategoryNameRus(categoryNumber: Int): String

@Query("SELECT categoryNameEng FROM category_table WHERE categoryNumber = :categoryNumber")
suspend fun getCategoryNameEng(categoryNumber: Int): String

看起来,你不应该返回String,你应该返回Flow<String>,并收集它:

suspend fun getCategoryNameFlow(): Flow<String> = combine( catNumFlow, natLangFlow ) { 
  cN, nL -> wordDao.getCategoryName(cN, nL)
}

...然后您应该收集该流量

launch {
  getCategoryNameFlow().collect { name ->
     (activity as MainActivity).supportActionBar?.title = name
  }
}

...只要其他流之一更新,就会更新标题。