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

我可以监控Kotlin中的变量吗?,kotlin,Kotlin,我希望监视一个变量,当变量改变时,我会做一些事情,也许就像代码a一样 如何用Kotlin编写这些代码?谢谢 代码A var myList: List<Int> registerMonitorVar(myList) fun onVariableChange(){ if (myList.size>=1){ btnDelete.enabled=true } } 代码2 allList.clear() allList.addAll(SettingHand

我希望监视一个变量,当变量改变时,我会做一些事情,也许就像代码a一样

如何用Kotlin编写这些代码?谢谢

代码A

var myList: List<Int>

registerMonitorVar(myList)

fun onVariableChange(){
   if (myList.size>=1){
      btnDelete.enabled=true
   }
}
代码2

allList.clear()
 allList.addAll(SettingHandler().getListAllSetting().toMutableList()) //Observable Doesn't Work

您可以重写and 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
   }
}
这个代码有效吗

对于注释,您可以使用以下内容:

private var allList = listOf<String>()
    set(value) {
        field = value
        onVariableChange()
    }
private var allList=listOf()
设置(值){
字段=值
onVariableChange()
}
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.
}
输出:

list = [1, 2, 3, 4]
list = [1, 2, 3, 4, 1, 2, 88, 9]  


最后,你可以看看这个有ObservableList的nice,如果这是你需要的,最好用它而不是自己写。

谢谢!,请看我修改的问题好吗?谢谢!如果我使用代码
allList.addAll(…)
更改allList的值,您的监视器代码将无法工作!请看我修改的问题。您可以使此列表不可变,并且人们只能“设置”您的列表。这样您就可以监视所有更改。谢谢!我如何使这个列表不可变,人们只能“设置”我的列表,你能给我一些示例代码吗?使用
list
而不是
MutableList
ArrayList
LinkedList
。见我的编辑谢谢!,请你看看我修改过的问题好吗?我将编辑我的答案,但是如果你问一个新问题,下次在这里发布链接会更好。非常感谢,在你的代码和ice1000的代码之间,哪一个更好?我想是我的。因为它给了你更多的灵活性,对我来说,我正在努力实现的目标更加明显。他们把它放在kotlin stander图书馆是有原因的。谢谢!如果我使用代码
allList.addAll(…)
更改allList的值,您的监视器代码将无法工作!请看我修改过的问题。
var myList: List<Int> // maybe here's a missing initialization 
  set(value) {
    field = value
    onVariableChange()
  }

fun onVariableChange() {
   if (myList.size >= 1) {
      btnDelete.enabled = true
   }
}
private var allList = mutableListOf<String>()
    set(value) {
        field = value
        onVariableChange()
    }


fun onVariableChange() {
    if (allList.size >= 1) {
    }
}
private var allList = listOf<String>()
    set(value) {
        field = value
        onVariableChange()
    }
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.
}
var myList: List<Int> by Delegates.vetoable(listOf()) { property, oldValue, newValue ->
    newValue.isNotEmpty()
}
var allList: MutableList<String>  by Delegates.observable(mutableListOf<String>()) { property, oldValue, newValue ->
    btnRestore.isEnabled = newValue.size >= 1
    btnBackup.isEnabled = newValue.size >= 1
}
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}")
}
list = [1, 2, 3, 4]
list = [1, 2, 3, 4, 1, 2, 88, 9]