为什么私有集对MutableLiveData不起作用?

Ser*_*kov 2 android kotlin android-architecture-components

我有一个密码

var exampleData = MutableLiveData<String>()
    private set
Run Code Online (Sandbox Code Playgroud)

我想将设置器隐藏为MutableLiveData的值

    exampleData.value = "Hi!" // still working
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,但是所有方法都在工作!

var exampleData = MutableLiveData<String>()
    private set(value) { field = value } // Working!

var exampleData = MutableLiveData<String>()
    internal set // Working!

var exampleData = MutableLiveData<String>()
    internal set(value) { field = value } // Working!
Run Code Online (Sandbox Code Playgroud)

如何隐藏此二传手?

tyn*_*ynn 6

属性的设置器与您无关MutableLiveData,因为它在对象本身内具有可变性。您必须将其转换为LiveData,可以使用backing属性来完成。

private val _exampleData = MutableLiveData<String>()
val exampleData: LiveData<String> get() = _exampleData
Run Code Online (Sandbox Code Playgroud)

您可以使用私下更改值,_exampleData.value = "value"并且仅公开不可变的LiveData

  • 我喜欢这个建议。但是为什么不直接执行 `val exampleData: LiveData&lt;String&gt; = _exampleData `? (2认同)
  • @Rule 那也是可能的。但是你最终会得到两个不同的字段和一个访问器。当您委托给后备属性时,您将只有一个具有该访问器的字段。 (2认同)
  • IMO 这并不按预期工作,您仍然可以从应用程序中的任何位置调用 `exampleData` getter,将结果转换为 `MutableLiveData` (因为 `_exampleData` 仍然是 `MutableLiveData` 类型)并调用 `setValue` 函数:`( exampleData 作为 MutableLiveData).value = ...`。这项任务需要更复杂的东西。 (2认同)