【问题标题】:How to initialise a generic declared Kotlin MutableStateFlow如何初始化一个通用声明的 Kotlin MutableStateFlow
【发布时间】:2020-09-01 08:47:48
【问题描述】:

我正在调查 Kotlin MutableStateFlow/StateFlow 并希望在通用基类中声明我的 MutableStateFlow,如下所示:-

class MyBaseClass<S> {

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

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

}

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

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

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

【问题讨论】:

  • 我发现这个问题很有用stackoverflow.com/questions/43477903/…
  • 无论如何,我认为你可以用一些东西包装 S,你可以通过已知的构造函数/提供者实例化。也许是一些包装类?
  • @Steyrix 感谢您的建议,我已经看到了那个问题/答案,但是我不喜欢使用 .class 构造函数等的想法
  • 你不能直接在MyBaseClass&lt;S&gt;的构造函数中添加一个参数表示默认值,然后传递给MutableStateFlow&lt;S&gt;()吗?

标签: kotlin kotlin-flow


【解决方案1】:

建立在 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&lt;S&gt; = ConflatedBroadcastChannel()

【讨论】:

    【解决方案2】:

    您可以从派生类中获取默认初始状态值,例如,

    abstract class MyBaseClass<S> {
    
        abstract val initialState: S
    
        private val internalState = MutableStateFlow<S>(initialState)
    
        val state: StateFlow<S>
            get() = internalState
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2015-04-27
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多