Kotlin @Deprecated ReplaceWith 将函数更改为变量赋值

标签 kotlin

我有以下要弃用的功能扩展

fun <T : View> T.setVisible(visible: Boolean) {
    visibility = if (visible) View.VISIBLE else View.GONE
}

弃用的用法:
myTextView.setVisible(true)

新用法:
myTextView.isVisible = true

我正在尝试编写一个 @Deprecated ReplaceWith 表达式,它将自动修复此弃用。我尝试了以下方法,但似乎不起作用:
@Deprecated("Use Android KTX isVisible", replaceWith = ReplaceWith("isVisible = visible", "androidx.core.view.isVisible"))
fun <T : View> T.setVisible(visible: Boolean) {
    visibility = if (visible) View.VISIBLE else View.GONE
}

当我在“myTextView.setVisible(true)”上按 Alt+ENTER 并从弹出窗口中选择“Replace with isVisible = visible”时,它只会删除我已弃用的​​代码

是否有 ReplaceWith 表达式可用于自动修复我的代码(将函数调用更改为赋值)?

最佳答案

同时,在修复相关错误之前,这里有一些解决方法,所有这些都有自己的特定缺点:

  • 替换为无用的类型转换:
    ReplaceWith("(this as T).isVisible = visible")
    

    这会将您的代码转换为:
    (myTextView as View).isVisible = true
    

    IDE 可能会警告您不需要此转换,您可以在第二步中修复此问题
  • 使用类似 also 的东西
    ReplaceWith("also { it.isVisible = visible }")
    

    它将您的代码转换为:
    myTextView.also { it.isVisible = true }
    

    这段代码可能不会在你的 IDE 中引起任何警告,但它显然比需要的要长
  • 与之前类似,但使用 apply :
    ReplaceWith("apply { this@apply.isVisible = visible }")
    // leading to:
    myTextView.apply { isVisible = true }
    

  • 如果您没有其他方法可以轻松更改调用者代码并希望为您的调用者提供一些帮助来替换那些不会立即删除最重要信息的已弃用代码;-) 如果您有权访问调用者代码,那么您最好手动替换它;-)

    关于Kotlin @Deprecated ReplaceWith 将函数更改为变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53024849/

    相关文章:

    java - 在 Kotlin 中使异步调用同步

    java - 没有 UI 的 Android 后台服务没有应答

    android-intent - intent.getStringExtra 不能为空 kotlin

    kotlin - 如何正确处理泛型类型?

    android studio按钮可见性

    android - 上传完成前调用 Firebase Storage onSuccess

    kotlin - 相当于 Kotlin 中 C# 的 Semaphore/SemaphoreSlim?

    android - 如何使用箭头键将焦点从撰写按钮移动到撰写文本字段?

    Android 在 R.raw 中找不到文件

    swift - Kotlin 有类似 Swift Optional 的类型吗?