我希望监视一个变量,当变量发生变化时我会做一些事情,也许就像代码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)
否决权正在做你想要的.来自文档:
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,如果你需要你更好地使用它而不是自己编写它.
您可以覆盖 和 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 = blabla,onVariableChange就会被调用。
编辑一下,为什么不
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)
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |