【问题标题】:Initialize LiveData later in ViewModel稍后在 ViewModel 中初始化 LiveData
【发布时间】:2020-05-28 11:16:53
【问题描述】:

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

  • 一个是通过 API 获取项目的列表
  • 另一个是上一个列表中所选项目的详细活动

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

目前是这样处理的:

详细活动:

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)
            }
        })
    }

视图模型

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?

【问题讨论】:

    标签: android kotlin android-livedata android-viewmodel


    【解决方案1】:

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

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

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

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

    lateinit var myLiveData: LiveData<T>
    

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

    【讨论】:

    • ::myLiveData 是什么我想不通
    • 我用它来访问myLiveData对象的反射属性。
    【解决方案2】:

    基本上lazy 不会创建第二个实例,ViewModel 引用不会重新创建。 所以我们可以用Val value: LiveData&lt;Details&gt; = MutableLiveData()代替lazy。

    您可以在init 块本身中添加getDetails() 方法以避免第二次调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-02
      • 2020-05-27
      • 1970-01-01
      • 2020-12-26
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多