微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何基于lateinit属性构建实时数据?

如何解决如何基于lateinit属性构建实时数据?

我有一个延迟初始化的属性。 现在我想提供一个实时数据,该数据在属性完全初始化之前不会发出任何内容。 如何以适当的 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)
}

然后通过对应的视图模型方法发送想要的数据

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。