Android Kotlin take(int).toList()省略第一个元素

Android Kotlin take(int).toList()省略第一个元素,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,我有一个测试LiveData,它每2秒发出一个项目。 我将其转换为flow,并对其调用take(3).toList() liveData的实现使其首先发出加载,然后继续发出成功,因此我希望在列表中看到: LOADING, SUCCESS, SUCCESS 但出于某种原因,它只是回来了 Item LOADING Item SUCCESS Item SUCCESS SUCCESS , SUCCESS , SUCCESS 奇怪的是,它在onEach中打印正确的值,如果我将“take(3)”替换为

我有一个测试LiveData,它每2秒发出一个项目。 我将其转换为flow,并对其调用take(3).toList()

liveData的实现使其首先发出加载,然后继续发出成功,因此我希望在列表中看到:

LOADING, SUCCESS, SUCCESS
但出于某种原因,它只是回来了

Item LOADING
Item SUCCESS
Item SUCCESS
SUCCESS , SUCCESS , SUCCESS 
奇怪的是,它在onEach中打印正确的值,如果我将“take(3)”替换为“first()”,我确实获得了正确的加载状态


有人经历过这种行为吗?在我看来,它不是一个合适的对象,因此,如果它不是已知的情况,我将打开一个错误报告。

因此,事实证明它发生了,因为我的LiveData一直在修改一个对象并发送它,而不是每次都创建一个新实例

我有一个与此类似的LiveData:

class EmittingLiveData : LiveData<StateData<Int>>() {

    init {
        value = StateData()
    }

    override fun observe(owner: LifecycleOwner, observer: Observer<in StateData<Int>>) {
        startEmitting()
        super.observe(owner, observer)
    }

    override fun observeForever(observer: Observer<in StateData<Int>>) {
        startEmitting()
        super.observeForever(observer)
    }

    private fun startEmitting() {
        GlobalScope.launch(Dispatchers.Unconfined) {
            value = value?.loading()

            async {
                while (this.isActive) {
                    delay(1000)
                    postValue(value?.success(0))
                }
            }.start()
        }
    }

}
class-EmittingLiveData:LiveData(){
初始化{
value=StateData()
}
覆盖乐趣观察(所有者:生命周期所有者,观察者:观察者){
开始匹配()
超级观察者(所有者、观察者)
}
覆盖有趣的ObserveForver(观察者:观察者){
开始匹配()
超级观察员(观察员)
}
私人娱乐开始配对(){
环球镜发射(调度员,无限制){
值=值?.loading()
异步的{
而(this.isActive){
延迟(1000)
postValue(值?.success(0))
}
}.start()
}
}
}
必须将入账价值更改为

postValue(StateData<Int>().success(0))
postValue(StateData().success(0))
一个新手对象引用问题,但我没想到会从flow中得到。因此,也许其他人也会觉得这很有帮助:)

帮助我的积分转到qwwdfsad

postValue(StateData<Int>().success(0))