android - 稍后在 ViewModel 中初始化 LiveData

标签 android kotlin android-livedata android-viewmodel

最近选择使用 LiveData,我在初始化变量时遇到了问题。 我有 2 项 Activity (我不使用导航,但这不是重点):

  • 其中一个是包含通过 API 获取的项目的列表
  • 另一个是上一个列表中所选项目的详细 Activity

问题是我需要能够在创建模式下查阅详细 Activity ,即在我的 ViewModel 中,不得通过 Retrofit 检索对象,而是通过新的实例化创建对象。

目前的做法是这样的:

详细 Activity :

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.details)

        val isNew = intent.extras?.getBoolean("new")
        if (isNew) {
            // Trigger lazy property
            viewModel.value
        } else {
            viewModel.getDetails()
        }

        presenter.value.observe(this, Observer { value ->
            value?.let {
                displayDetails(it)
            }
        })
    }

View 模型

class DetailsPresenter(private val repository: WorkOrderRepository)
    : ViewModel(), LifecycleObserver {

    val value: MutableLiveData<Details> by lazy { MutableLiveData(Details("")) }

    fun getDetails() {
        RetrofitClient.getDetails()
        .onSuccess {
            this.value.value = it
        }

    }

}

这个方法的问题是我的displayDetails()方法被调用了两次。 一个用于延迟初始化,另一个用于我正在查看现有项目。

稍后如何在代码中初始化 LiveData?

最佳答案

当然,它会被调用两次,第一次被调用是因为你在 View 中注册了一个观察者,这使得lazy工作并创建LiveData 对象。第二次调用它是因为 Retrofit 更新了 LiveData 对象。您正在发出网络请求,它们总是需要时间才能完成,直到那时,您的程序在等待请求完成的同时开始执行下一行(在您的情况下它正在设置观察者)。

如果无论 if-else 条件如何,都要观察它,那么延迟初始化 value 对象是没有意义的。

我会在 ViewModel 的 init block 中进行改造调用并将其缓存在那里。

您可以使用lateinit关键字稍后初始化该对象。

lateinit var myLiveData: LiveData<T>

要检查myLiveData是否已初始化,只需编写if (::myLiveData.isInitialized)

关于android - 稍后在 ViewModel 中初始化 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62063377/

相关文章:

android - cordova 检测应用程序是否从 Google Play 下载

android - 在 java 中对数组列表使用 Getter 和 Setter

android - Viewmodel 观察 LiveData - 如何?

android - BitmapFactory 无法解码流。致命的空指针错误

Android应用程序发布问题

android - 更新 Firestore 中的文档

android - Kotlin - 使用 Persistence Room :runtime lib 从 Room 数据库返回新插入的 id

kotlin - 为什么 Kotlin Lambda 函数在调用时不执行?

android - 尽管数据没有改变,但一些 fragment 观察者在从返回堆栈弹出后触发

安卓单元测试: How to mock an object which contains MutableLiveData but only exposes LiveData?