Android 如何组合两个流,将它们的值作为参数传递到suspend fun(返回字符串)中?

Android 如何组合两个流,将它们的值作为参数传递到suspend fun(返回字符串)中?,android,kotlin,kotlin-coroutines,Android,Kotlin,Kotlin Coroutines,以前,当ViewModel中的“suspend fun getCategoryName(categoryNumber:Int)”函数只包含一个参数-categoryNumber:Int时,我通常在片段中以这种方式将其展开: viewModel.categoryNumber.observe(viewLifecycleOwner) { viewLifecycleOwner.lifecycleScope.launch { (activity as MainAct

以前,当ViewModel中的“suspend fun getCategoryName(categoryNumber:Int)”函数只包含一个参数-categoryNumber:Int时,我通常在片段中以这种方式将其展开:

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

viewModel.categoryNumber.observe(viewLifecycleOwner) {
        viewLifecycleOwner.lifecycleScope.launch {
            (activity as MainActivity).supportActionBar?.title = viewModel.getCategoryName(it)
        }
    }
现在我添加了第二个参数NativeLanguage(enum),我不知道如何组合这两个Argumnet并将它们传递到一个方法中,以将其放入片段中。索姆博迪能帮忙吗?谢谢你的帮助

PS我试过像这样的ti类型:

suspend fun catName(): String = combine( catNumFlow, natLangFlow ) { cN, nL ->
        Pair(cN, nL)
    }.flatMapLatest { (cN, nL) ->
        wordDao.getCategoryName(cN, nL)
    }
但这里存在类型不匹配,因为Dao函数是一个返回字符串,而两个流的组合返回流

我还试着把一个观察者放到另一个观察者身上,效果很好:

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

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)

从外观上看,您不应该返回
字符串
,而应该返回
,并收集它:

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

…它将在其他流更新时更新标题。

哦,太好了,非常感谢你真的帮助了我。
launch {
  getCategoryNameFlow().collect { name ->
     (activity as MainActivity).supportActionBar?.title = name
  }
}