【问题标题】:How to build a live data based on lateinit property?如何基于 lateinit 属性构建实时数据?
【发布时间】:2021-09-03 11:25:36
【问题描述】:

我有一个延迟初始化的属性。 现在我想提供一个在属性完全初始化之前不会发出任何东西的实时数据。 如何以正确的 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(){
  ...
 }

 

【问题讨论】:

    标签: android kotlin android-livedata coroutine deferred


    【解决方案1】:

    声明一个 MutableLiveData 发出 SomeConnection 类型的值和一个相应的 LiveData。

    private val _connectionLiveData = MutableLiveData<SomeConnection>()
    val connectionLiveData: LiveData<SomeConnection> = _connectionLiveData
    

    然后在_connection初始化的时候给_connectionLiveData赋值:

    if (::_connection.isInitialized()) _connectionLiveData.value = _connection
    

    (或_connectionLiveData.postValue(_connection),如果您的代码同时工作)

    现在在代码的另一个地方观察这个 LiveData,我将在这里使用片段作为示例:

    override fun firstOnViewCreated(view: View, savedInstanceState: Bundle?) {
        viewModel.connectionLiveData.observe(this, ::sendData)
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-12
      • 2021-05-06
      • 1970-01-01
      • 2012-07-13
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多