我在我的项目中使用MutableStateFlow。当我们初始化MutableStateFlow对象时,我们需要给出默认值。
val topics = MutableStateFlow<List<String>>(emptyList())
收集这个值
[null, "Hello", "world"]
我想在适配器中传递这个列表。有没有一种方法可以在传入适配器之前删除null对象,或者有没有更好的方法?
viewModel.topics.collect { topicsList ->
println(topicsList) // [null, "Hello", "world"]
adapter.submitList(topicsList)
}
如果你不希望它有一个强制的初始值,使用MutableSharedFlow代替。如果你给它replay = 1
,onBufferOverflow = BufferOverflow.DROP_OLDEST
和distinctUntilChanged()
,它基本上和没有强制value
的MutableStateFlow是一样的。如果onBufferOverflow
不是BufferOverflow.SUSPEND
,则tryEmit
将始终成功,因此您可以使用tryEmit()
而不是value =
。
private val _topics = MutableSharedFlow<List<String>>(
replay = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST
)
val topics: Flow<List<String>> = _topics.distinctUntilChanged()
// emitting to the shared flow:
_topics.tryEmit(newValue)
因为它发出一个字符串列表,你可以尝试用null来初始化StateFlow,像这样
val topics = MutableStateFlow<List<String>?>(null)
当你收集时,你可以检查发出的值是否为null
viewModel.topics.collect { topicsList ->
topicsList?.let { safeTopics ->
adapter.submitList(safeTopics)
}
}
如果您想忽略StateFlow的初始值,可以设置初始值null
或任何您想要的值。然后,您可以使用filter
功能的流量。
例如初始值为null
launch {
val topicsState = MutableStateFlow<List<String?>?>(null)
topicsState.filterNotNull().map { topics -> topics.filterNotNull() }.onEach { topics ->
println(topics)
}.launchIn(this)
launch {
delay(1000)
topicsState.update { listOf(null, "Hello", "world") }
}
}
输出[Hello, world]
如果我们给出了一个通用的泛型类型密封类
通用密封类
sealed class Resource<T>(val data: T? = null, val error: String? = null) {
class Loading<T> : Resource<T>()
class Success<T>(data: T) : Resource<T>(data = data)
class Error<T>(error: String) : Resource<T>(error = error)
}
在这种情况下,我们可以这样设置初始值:
private val _mutableStateFlow: MutableStateFlow<Resource<List<PackageModel>>?> = MutableStateFlow(null)
PackageModel是Model/Pojo类
我认为你需要的是:
val sampleList = listOf(null, "Hello", "world")
val topics = MutableStateFlow<List<String>>(sampleList.filer { it != null })
您可以使用drop(1)
:
viewModel.topics.drop(1).collect { topicsList ->
...
}