如何避免MutableStateFlow kotlin中的默认值



我在我的项目中使用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_OLDESTdistinctUntilChanged(),它基本上和没有强制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 ->
...
}

相关内容

  • 没有找到相关文章

最新更新