【问题标题】:Kotlin Android Studio - Var is seen as val in SDK 29Kotlin Android Studio - Var 在 SDK 29 中被视为 val
【发布时间】:2019-07-20 21:27:52
【问题描述】:

我在 Kotlin 中遇到了一件很奇怪的事情。 我有

var myClipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
var myClip: ClipData? = ClipData.newPlainText( /* my code */ )

作为var 变量,我应该能够重新分配他的值,但是当我这样做时

myClipboard?.primaryClip = myClip

它给了我错误

Val 无法重新分配

最奇怪的是,我使用这段代码已经好几个星期了,而且它总是有效。当我更新到 API 29 时,它今天停止工作

这是我的build.gradleandroid{}

    android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.arfmann.pushnotes"
        minSdkVersion 23
        targetSdkVersion 29
        versionCode 16
        versionName "1.6"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

【问题讨论】:

  • myClipvarmyClipboardvar。您正在尝试设置myClipboard?.primaryClip,这两者都不是。不过,您的语法应该可以工作。尝试将其切换到 myClipboard?.setPrimaryClip() 看看你会得到什么。
  • 错误是指primaryClip而不是myClipboard

标签: android kotlin


【解决方案1】:

如在ClipboardManager documentation 中所见,getPrimaryClip 返回一个ClipData?(即,一个可为空的ClipData),而setPrimaryClip() 采用一个ClipData - 一个非空的ClipData

Kotlin 不支持在类型不同时访问 var 属性(并且可空性是 Kotlin 类型的重要组成部分),因此 Kotlin 只能在您调用 primaryClip 时有效地为您提供 val 等效项。

setPrimaryClip 上的可空性注释是在 API 29 中添加的,这就是升级 compileSdkVersion 后行为不同的原因。

要设置主要剪辑,您必须明确使用 setPrimaryClip() 和非空 ClipData,或者在 API 28+ 上,使用 clearPrimaryClip() 完全清除主要剪辑。

【讨论】:

【解决方案2】:

这样使用

val clipboard = ctx.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Beacon infos", it.toJson())
clipboard.setPrimaryClip(clip)

【讨论】:

    【解决方案3】:

    这是工作副本,

        val myClipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
        val myClip: ClipData? = ClipData.newPlainText("", "")
    
        myClipboard?.primaryClip = myClip
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2023-03-10
      • 2020-08-08
      • 2022-10-24
      • 1970-01-01
      • 2014-05-14
      • 2019-05-04
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多