android - 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内部,则代码可以正常工作。我究竟做错了什么?
解决方案
这是因为在观察者处于活动状态之前不会发出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
推荐阅读
- deep-learning - 训练 Yolo 以检测具有关键点或地标的对象
- javascript - ESlint 规则的 RuleTester 上的 AssertionError
- django - Django:如何通过与外键相关的对象获取对象
- javascript - 未捕获的类型错误:在 init.e.fn.valid 处非法调用
- python - 由于错误而未显示绘图:AttributeError: 'NoneType' object has no attribute 'set_canvas'
- reactjs - 设置父组件的状态
- ios - 更改配置的顺序
- ios - 如何在 AVAudioRecorder 中控制 Opus 比特率
- openlayers - Here Satellite Map WMS 或 WMTS 服务
- c++ - 为什么 Qt SIGNAL(clicked(bool) 与真正的鼠标点击行为不同?