kotlin state.asStateFlow()和flow.stateIn()有什么区别?

rdlzhqv9  于 2023-04-21  发布在  Kotlin
关注(0)|答案(2)|浏览(156)

在我看来有两种相等的结构,它们中的哪一种应该在什么时候使用,以及这些方法的优点是什么?
第一个是:

private val _chats: MutableStateFlow<List<Chat>> = MutableStateFlow(emptyList())
val chats: StateFlow<List<Chat>> = _chats.asStateFlow()

init {
    viewModelScope.launch {
        repository.chatsFlow.collect { chats ->
            _chats.value = chats
        }
    }
}

第二个:

val chats: StateFlow<List<Chat>> = repository.chatsFlow
    .stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5000L),
        initialValue = emptyList()
    )
vi4fp9gy

vi4fp9gy1#

应该避免使用MutableStateFlow/asFlow方式。除了非常冗长之外,它还不断地收集上游流,即使它没有从上游流收集任何东西,这会浪费资源。

wxclj1h5

wxclj1h52#

从基本层面上看,是的。它们(几乎)相同:它们都创建了val chats,然后可以在ViewModel中进一步使用。
关键的区别是val _chats-虽然chats是不可变的,_chats是可变的;如果_chats的值发生了变化,chats中的值也会发生变化,这样你就可以控制可变列表中的数据,同时也可以为你的ViewModel提供一个不可变的列表。

相关问题