gpt4 book ai didi

android - 除非使用明确的作用域,否则为什么Kotlin Synthetic是Null

转载 作者:行者123 更新时间:2023-12-02 12:41:13 30 4
gpt4 key购买 nike

因此,我这里有一些以前可以工作一个月的代码。

profile_clickable.throttleClicks {
logger.logEvent(PageTags.MENU_PROFILE_NAV)
edit_picture_button.visibility = View.GONE
ProfileActivity.start(this@HomeMenuActivity, avatar.transition(), username.transition())
}

现在,此代码失败,并且在均为Kotlin合成物的 edit_picture_buttonavatarusername上使用了NPE。

当我为这些项目中的每一个添加显式调用时(见下文),它突然起作用。
profile_clickable.throttleClicks {
logger.logEvent(PageTags.MENU_PROFILE_NAV)
this@HomeMenuActivity.edit_picture_button.visibility = View.GONE
ProfileActivity.start(this@HomeMenuActivity, this@HomeMenuActivity.avatar.transition(), this@HomeMenuActivity.username.transition())
}

valveClicks是执行此操作的扩展方法:
fun View.throttleClicks(
windowDurationMs: Long = 800,
onClick: View.() -> Unit
) {
setOnClickListener(object : View.OnClickListener {

// Set lastClickTime to - windowDurationMs to ensure the first click won't be throttled.
var lastClickTime = -windowDurationMs

override fun onClick(v: View?) {
val time = SystemClock.elapsedRealtime()
if (time - lastClickTime >= windowDurationMs) {
lastClickTime = time
onClick()
}
}
})
}

为什么突然需要使用显式作用域来避免NPE?

最佳答案

因为您在View.() -> Unit类型的函数中使用了合成。

因此,函数中的this是您可以应用此函数的 View (profile_clickable)。

Kotlin合成 Material 像

val View.profile_clickable: ImageView get() {
if (cache exists) {
return cache
}
return this.findViewById(R.id.profile_clickable)
}
profile_clickable没有任何 child ,因此会有异常(exception)。

您可以使用以下代码:
profile_clickable.throttleClicks {
logger.logEvent(PageTags.MENU_PROFILE_NAV)
this@HomeMenuActivity.run {
edit_picture_button.visibility = View.GONE
ProfileActivity.start(this, avatar.transition(), username.transition())
}
}

关于android - 除非使用明确的作用域,否则为什么Kotlin Synthetic是Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59181526/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com