【问题标题】:Android : Smart cast to 'Bitmap!' is impossible, because 'bitmap' is a mutable property that could have been changed by this timeAndroid:智能投射到“位图!”是不可能的,因为“位图”是一个可变属性,此时可能已更改
【发布时间】:2020-04-16 14:04:22
【问题描述】:

在将具有 targetSDK 28 的应用程序迁移到 29 时,Android Studio(3.6.2) 在编译代码时开始出错。目标 SDK 设置为 28,代码编译良好。有人对此有想法吗?是否有任何严格的规则适用于相同的 android studio 和 Kotlin 版本的这种行为变化?


下面是代码:

private fun generateInternalCanvas(w: Int, h: Int) {
    bitmap?.recycle()
    if (w > 0 && h > 0) {
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
        bitmap?.eraseColor(Color.TRANSPARENT)
        internalCanvas = Canvas(bitmap)
    }
}

当我为 internalCanvass 赋值时,我遇到了上述错误。

谢谢,
吉姆。

【问题讨论】:

  • 我认为'bitmp'是一个变量,你在你的应用程序中定义。给你看代码!
  • 我已经粘贴了代码。我可以用 bitmap?.let { internalCanvas = Canvas(it) } 解决这个问题,但我想知道为什么 android studio 在 targetSDKVersion 更改后抛出错误?谢谢。

标签: android android-studio kotlin


【解决方案1】:

那是因为您的bitmap 是具有空安全性的变量(代码看起来像这样var bitmap : Bitmap? = null)。但我认为您的代码可以安全地将bitmap 在该代码中设为非空,因为您使用Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) 分配位图。所以解决方案是您可以将代码更改为:

private fun generateInternalCanvas(w: Int, h: Int) {
    bitmap?.recycle()
    if (w > 0 && h > 0) {
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
        bitmap?.eraseColor(Color.TRANSPARENT)
        internalCanvas = Canvas(bitmap!!)
    }
}

【讨论】:

    【解决方案2】:

    应该改成这样的代码:

    private fun generateInternalCanvas(w: Int, h: Int) {
        bitmap?.recycle()
        if (w > 0 && h > 0) {
            val bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) // <-
            this.bitmap = bitmap // <-
            bitmap.eraseColor(Color.TRANSPARENT)
            internalCanvas = Canvas(bitmap)
        }
    }
    

    现在您确保该位图存在于接下来的 3 行中

    【讨论】:

    • 感谢您的回复。我明白了,有几种方法可以解决。我很想知道为什么使用 targetSDK 28 代码编译得很好,但是使用 targetSDKVersion 29,它开始给我编译时错误。内部发生了什么变化?有什么想法吗?
    • Canvas(bitmap) 的可空性注释,我想。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2021-10-16
    • 2017-11-19
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多