Kotlin Android Studio-Var在SDK 29中被视为val

Arf*_*ann 6 android kotlin

我在科特林遇到了一件很奇怪的事情。我有

var myClipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager?
var myClip: ClipData? = ClipData.newPlainText( /* my code */ )
Run Code Online (Sandbox Code Playgroud)

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

myClipboard?.primaryClip = myClip
Run Code Online (Sandbox Code Playgroud)

它给我错误

Val无法重新分配

最奇怪的是,我几个星期都在使用此代码,并且始终有效。当我更新到API 29时,它今天停止工作

这是我的 build.gradle android{}

    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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 10

像这样使用它

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


ian*_*ake 5

随着中所看到的ClipboardManager文件getPrimaryClip返回ClipData?(即,可为空ClipData),同时setPrimaryClip()需要一个ClipData-一个非空ClipData

var当类型不同(且可空性是Kotlin输入的重要组成部分)时,Kotlin不支持属性访问,因此,val当您调用时,Kotlin仅能有效地给您等效的属性primaryClip

setPrimaryClip在API 29中添加了可空性注释,这就是为什么在升级时行为会有所不同的原因compileSdkVersion

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