如何在Kotlin中基于另一个Flow生成一个Flow?

fnatzsnv  于 2023-06-24  发布在  Kotlin
关注(0)|答案(2)|浏览(124)

我知道我可以像代码A一样使用derivedStateOf创建基于State<T>变量的Flow,而resultListAllMInfoStateFlow<EResult<List<MInfo>>>类型。
现在我希望得到一个StateFlow<EResult<List<MInfo>>>类型基于流_listSortBy在代码B,我该怎么做?
顺便说一句,_listMInfo是代码B中的Flow<StateFlow<EResult<List<MInfo>>>>类型。

新增内容:

我可以使用代码C吗?当代码C中的_listSortBy发生变化时,_listMInfo是否会自动更新?

代码A

class RecordSoundViewModel @Inject constructor(
): ViewModel() {

    var sortByState by mutableStateOf(ESortBy.START_PRIORITY)
        private set

    val resultListAllMInfo: StateFlow<EResult<List<MInfo>>> by derivedStateOf {
        handelMInfo.listAll(sortByState).stateIn(viewModelScope, SharingStarted.WhileSubscribed(), EResult.LOADING)
    }
}

fun listAll(eSortBy: ESortBy): Flow<EResult<List<MInfo>>>

代码B

class RecordSoundViewModel @Inject constructor(  
): ViewModel()
{  
    private val _listSortBy = MutableStateFlow(ESortBy.START_PRIORITY)

   //  _listMInfo  is Flow<StateFlow<EResult<List<MInfo>>>>
    private val _listMInfo = _listSortBy .map { handelMInfo.listAll(it).stateIn(viewModelScope, SharingStarted.WhileSubscribed(), EResult.LOADING)}

}

代码C

class RecordSoundViewModel @Inject constructor(  
): ViewModel()
{  
    private val _listSortBy = MutableStateFlow(ESortBy.START_PRIORITY)       
    private val _listMInfo = handelMInfo.listAll(_listSortBy.value)    
}

图片1

kgqe7b3p

kgqe7b3p1#

我仍然不完全理解你的意思,但我认为你指的是流与流之间的合并,所以你可以尝试这种方式。

class RecordSoundViewModel @Inject constructor(): ViewModel()
{
    private val _listSortBy = MutableStateFlow(ESortBy.START_PRIORITY)

    //  _listMInfo  is Flow<StateFlow<EResult<List<MInfo>>>>
    private val _listMInfo : Flow<EResult<List<MInfo>> = 
    combine(_listSortBy) { listSortBy ->
        // logic code
        // new list return here type EResult<List<MInfo>
        
    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), EResult.LOADING)
}
6mzjoqzu

6mzjoqzu2#

这里有一个简单的例子,当你想使用合并流

enum class ESortBy{
    START_PRIORITY,NONE
}
val handelMInfo = listOf("abc","bcd")
class RecordSoundViewModel @Inject constructor(
): ViewModel()
{
    private val _listSortBy = MutableStateFlow(ESortBy.START_PRIORITY)
    private val _listhandelMInfo = MutableStateFlow(handelMInfo)
    private val _listMInfo : Flow<List<String>> = combine(_listSortBy,_listhandelMInfo){ sortType, listData ->
        //logic code
        //return new list type List<String>
        emptyList()
    }
}

相关问题