首页 > 解决方案 > CoroutineLiveData 发出 null

问题描述

我正在学习Android LiveData。我有代码

    private lateinit var questionCounterTotal: LiveData<Int>

Fragment的内部onCreateView

questionList = questionViewModel.getAllQuestions()
questionCounterTotal = liveData { emit(44) }

//this line prints null 
questionCounterTotal.observe(viewLifecycleOwner,Observer<Int>{value->
    Log.d("amin",value.toString())
})

//this line prints null too
Log.d("amin",questionCounterTotal.value.toString())

questionCouterTotal正如评论所描述的,当代码托管在Fragment中时,我无法打印该值,但如果代码位于Activity内部,则代码可以正常工作。我究竟做错了什么?

标签: androidkotlinandroid-livedatakotlin-coroutines

解决方案


这是因为在观察者处于活动状态之前不会发出LiveData值。文档中:

LiveData 认为观察者(由 Observer 类表示)如果其生命周期处于 STARTED 或 RESUMED 状态,则它处于活动状态。

让我添加额外的日志来演示上述内容。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val questionCounterTotal = liveData {
        Log.d("amin", "Emitting 44")
        emit(44)
    }
    Log.d("amin", "The line after liveData { }")

    questionCounterTotal.observe(viewLifecycleOwner, Observer<Int>{ value->
        Log.d("amin","Observing value: $value")
    })

    Log.d("amin", "onViewCreated: ${questionCounterTotal.value.toString()}")
}

override fun onStart() {
    super.onStart()
    Log.d("amin", "onStart")
}

这给出了以下输出:

D/amin: The line after liveData { }
D/amin: onViewCreated: null
D/amin: onStart
D/amin: Emitting 44
D/amin: Observing value: 44

推荐阅读