我可以监控Kotlin中的变量吗?

Hel*_*oCW 1 kotlin

我希望监视一个变量,当变量发生变化时我会做一些事情,也许就像代码A一样.

如何在Kotlin中编写这些代码?谢谢!

代码A.

var myList: List<Int>

registerMonitorVar(myList)

fun onVariableChange(){
   if (myList.size>=1){
      btnDelete.enabled=true
   }
}
Run Code Online (Sandbox Code Playgroud)

要ice1000

谢谢!但以下代码不起作用!我不知道如何在需要set属性时初始化allList.

private lateinit var allList: MutableList<MSetting> set(value) {
        field = value
        onVariableChange()
}

private  var allList=mutableListOf<MSetting>() set(value) {
        field = value
        onVariableChange()
}

fun onVariableChange(){
    if (allList.size>=1){

     }
}
Run Code Online (Sandbox Code Playgroud)

为了humazed:

谢谢!为什么以下代码不正确?

 private var allList: MutableList<MSetting>  by Delegates.vetoable(mutableListOf<MSetting>())
    { property, oldValue, newValue ->
        {
            btnRestore.isEnabled=(newValue.size >= 1)
            btnBackup.isEnabled=(newValue.size >= 1)
        }

    }
Run Code Online (Sandbox Code Playgroud)

要humazed和ice1000

谢谢!当我使用Code 2时,系统无法监视var allList的更改

 private var allList: MutableList<MSetting>  by Delegates.observable(mutableListOf<MSetting>())
    { property, oldValue, newValue ->
        btnRestore.isEnabled = newValue.size >= 1
    }
Run Code Online (Sandbox Code Playgroud)

代码1

allList=SettingHandler().getListAllSetting().toMutableList() // Observable Work
Run Code Online (Sandbox Code Playgroud)

代码2

allList.clear()
 allList.addAll(SettingHandler().getListAllSetting().toMutableList()) //Observable Doesn't Work
Run Code Online (Sandbox Code Playgroud)

hum*_*zed 5

Kotlin 可观察否决是这个用例的完美之选.

否决权正在做你想要的.来自文档:

vetoable:
返回读/写属性的属性委托,该属性在更改时调用指定的回调函数,允许回调否决修改.

例如,您可以使用:

var myList: List<Int> by Delegates.vetoable(listOf()) { property, oldValue, newValue ->
    if (newValue.size >= 1)
        true // apply the change to myList
    else
        false // ignore the change. ie. myList stay the same.
}
Run Code Online (Sandbox Code Playgroud)

或者干脆:

var myList: List<Int> by Delegates.vetoable(listOf()) { property, oldValue, newValue ->
    newValue.isNotEmpty()
}
Run Code Online (Sandbox Code Playgroud)

编辑完成后.我在下一个示例中看到observable更合适,因为您似乎希望无论条件如何都要更改列表.

var allList: MutableList<String>  by Delegates.observable(mutableListOf<String>()) { property, oldValue, newValue ->
    btnRestore.isEnabled = newValue.size >= 1
    btnBackup.isEnabled = newValue.size >= 1
}
Run Code Online (Sandbox Code Playgroud)

你的代码不起作用,因为你添加了不必要的{}和使用vetoable而没有返回true或false.



对于编辑的答案.它应该得到自己的问题,但无论如何我都会在这里回答.

您可以使用list,当您想要更改列表时,将其替换为新列表.这会影响性能,因为每次需要添加或删除项目时都会创建新列表.

或者您可以扩展列表类或使用扩展函数来响应添加和删除操作.例如: -

fun main(args: Array<String>) {
    val myList = mutableListOf<Int>()

    myList.addAllAndNotify(listOf(1, 2, 3, 4))
    myList.addAllAndNotify(listOf(1, 2, 88, 9))
}

fun <E> MutableList<E>.addAllAndNotify(elements: Collection<E>) {
    addAll(elements)
    doStuff(this)
}

fun <E> doStuff(list: List<E>) {
    println("list = ${list}")
}
Run Code Online (Sandbox Code Playgroud)

输出:

list = [1, 2, 3, 4]
list = [1, 2, 3, 4, 1, 2, 88, 9]  
Run Code Online (Sandbox Code Playgroud)

最后,你可以看一下这个有ObservableList的好的lib,如果你需要你更好地使用它而不是自己编写它.


ice*_*000 3

您可以覆盖 和 setter。

var myList: List<Int> // maybe here's a missing initialization 
  set(value) {
    field = value
    onVariableChange()
  }

fun onVariableChange() {
   if (myList.size >= 1) {
      btnDelete.enabled = true
   }
}
Run Code Online (Sandbox Code Playgroud)

这样,如果您这样做myList = blablaonVariableChange就会被调用。

编辑一下,为什么不

private var allList = mutableListOf<String>()
    set(value) {
        field = value
        onVariableChange()
    }


fun onVariableChange() {
    if (allList.size >= 1) {
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效吗?

对于评论,您可以使用以下内容:

private var allList = listOf<String>()
    set(value) {
        field = value
        onVariableChange()
    }
Run Code Online (Sandbox Code Playgroud)