如何组合 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
}
}
...只要其他流之一更新,就会更新标题。
以前,当 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
}
}
...只要其他流之一更新,就会更新标题。