问题描述
我有一个延迟初始化的属性。 现在我想提供一个实时数据,该数据在属性完全初始化之前不会发出任何内容。 如何以适当的 Kotlin 方式执行此操作?
class SomeConnection {
val data: Flow<SomeData>
...
class Myviewmodel {
private lateinit var _connection: SomeConnection
// private val _connection: CompletableDeferred<SomeConnection>()
val data = _coonection.ensureInitilized().data.toLiveData()
fun connect(){
viewmodelScope.launch {
val conn = establishConnection()
// Here I have to do something for the call ensureInitilized to proceed
}
}
private suspend fun establishConnection(){
...
}
解决方法
声明一个 MutableLiveData 发出 SomeConnection 类型的值和相应的 LiveData。
private val _connectionLiveData = MutableLiveData<SomeConnection>()
val connectionLiveData: LiveData<SomeConnection> = _connectionLiveData
然后在初始化 _connectionLiveData
时为 _connection
赋值:
if (::_connection.isInitialized()) _connectionLiveData.value = _connection
(或 _connectionLiveData.postValue(_connection)
,如果您的代码同时工作)
现在在代码的另一个地方观察这个 LiveData,我将在这里使用片段作为示例:
override fun firstOnViewCreated(view: View,savedInstanceState: Bundle?) {
viewModel.connectionLiveData.observe(this,::sendData)
}
然后通过对应的视图模型方法发送想要的数据