kotlin - 如何初始化一个通用声明的 Kotlin MutableStateFlow

标签 kotlin kotlin-flow

我正在研究 Kotlin MutableStateFlow/StateFlow 并想在通用基类中声明我的 MutableStateFlow 如下:-

class MyBaseClass<S> {

private val internalState = MutableStateFlow<S>(//WHAT GOES HERE????//)

    val state: StateFlow<S>
        get() = internalState

}

我遇到的问题是 MutableStateFlow 具有强制性初始值。

我看不到如何提供“S”类型的通用初始值

是否可以使用这种采用通用基类实例变量的方法?

最佳答案

基于 Harshith Shetty 的回答,我所做的所有不同之处在于初始化 internalState因为懒所以我可以避免 accessing non-final property in constructor警告

abstract class MyBaseClass<S> {

    abstract val initialState: S

    private val internalState: MutableStateFlow<S> by lazy { MutableStateFlow(initialState) }

    val state: StateFlow<S>
        get() = internalState

}

顺便说一句,没有初始值就无法初始化 MutableStateFlow。如果您绝对不想要初始值,请使用 ConflatedBroadcastChannel相反。

例如

val internalState: ConflatedBroadcastChannel<S> = ConflatedBroadcastChannel()

关于kotlin - 如何初始化一个通用声明的 Kotlin MutableStateFlow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63684305/

相关文章:

android - Kotlin:未调用 onGlobalLayout

algorithm - Rabin-Karp字符串匹配的实现(滚动哈希)

firebase - 为什么 trySend 会发出假数据?

android - 在挂起功能可能失败的情况下,结合挂起功能和流功能的最佳方法是什么?

android - 如何在 jetpack compose Preview 中显示 Kotlin 协程流数据?

android - launchWhenStarted 和 repeatOnLifecycle(STARTED) 收集流的区别

javascript - Kotlin 是否支持 Javascript、Swift 或 Dart 等匿名对象?

kotlin - Kotlin 是 "pass-by-value"还是 "pass-by-reference"?

android - 使用 Dagger 2 + Kotlin + ViewModel 注入(inject) ViewModel

kotlin - Flow<List<T>> 而不是使用 Flow<T>?