android 如何避免MutableStateFlowKotlin中的默认值

3bygqnnd  于 2022-12-09  发布在  Android
关注(0)|答案(5)|浏览(456)

我在我的项目中使用MutableStateFlow。当我们初始化MutableStateFlow对象时,我们需要给予默认值。

val topics = MutableStateFlow<List<String>>(emptyList())

当我收集这个值时

[null, "Hello", "world"]

我想在adapter中传递这个列表。那么,有没有办法在传递adapter之前删除null对象,或者有没有更好的方法?

viewModel.topics.collect { topicsList ->
    println(topicsList)         // [null, "Hello", "world"]
    adapter.submitList(topicsList)
}
knpiaxh1

knpiaxh11#

如果不希望它有强制的初始值,可以使用MutableSharedFlow。如果给予它replay = 1onBufferOverflow = BufferOverflow.DROP_OLDESTdistinctUntilChanged(),它基本上与没有强制value的MutableStateFlow相同。如果onBufferOverflow不是BufferOverflow.SUSPENDtryEmit将始终成功,因此您可以使用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)
628mspwn

628mspwn2#

如果你想忽略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]
2skhul33

2skhul333#

我想你需要的是这个:

val sampleList = listOf(null, "Hello", "world")
val topics = MutableStateFlow<List<String>>(sampleList.filer { it != null })
fafcakar

fafcakar4#

由于它发出一个字符串列表,您可以尝试使用null初始化StateFlow,如下所示

val topics = MutableStateFlow<List<String>?>(null)

在收集时,您可以检查发出的值是否为空

viewModel.topics.collect { topicsList ->
    topicsList?.let { safeTopics ->
        adapter.submitList(safeTopics)
    }
}
bwitn5fc

bwitn5fc5#

如果我们已经给出了一个通用的泛型类型的sealed类。

通用密封类

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)

包模型是模型/Pojo类

相关问题