Android 如何组合两个流,将它们的值作为参数传递到suspend fun(返回字符串)中?
以前,当ViewModel中的“suspend fun getCategoryName(categoryNumber:Int)”函数只包含一个参数-categoryNumber:Int时,我通常在片段中以这种方式将其展开: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.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
}
}