智能投射到“位图!” 是不可能的,因为 'textBitmap' 是一个局部变量,由变化的闭包捕获

真相

当我构建我的项目时,我得到了这个错误

这是 kotlin 类代码

var textBitmap: Bitmap? = null
dynamicItem.dynamicText[imageKey]?.let { drawingText ->
            dynamicItem.dynamicTextPaint[imageKey]?.let { drawingTextPaint ->
drawTextCache[imageKey]?.let {
                    textBitmap = it
                } ?: kotlin.run {
                    textBitmap = Bitmap.createBitmap(drawingBitmap.width, drawingBitmap.height, Bitmap.Config.ARGB_8888)
                    val drawRect = Rect(0, 0, drawingBitmap.width, drawingBitmap.height)
                    val textCanvas = Canvas(textBitmap)
                    drawingTextPaint.isAntiAlias = true
                    val fontMetrics = drawingTextPaint.getFontMetrics();
                    val top = fontMetrics.top
                    val bottom = fontMetrics.bottom
                    val baseLineY = drawRect.centerY() - top / 2 - bottom / 2
                    textCanvas.drawText(drawingText, drawRect.centerX().toFloat(), baseLineY, drawingTextPaint);
                    drawTextCache.put(imageKey, textBitmap as Bitmap)
                }

我不知道如何解决它

仙人掌

基本上,Kotlin 不能智能地转换为该 lambda 内textBitmap的非空值。Bitmap您可能在Canvas(textBitmap)调用时遇到错误,该错误不能采用空参数,并且编译器不能保证textBitmap此时不为空。

这是 lambdas 引用 external s 的一个限制,var可以更改 - 我认为这是因为 lambda 可能会在其他时间运行,因此无法保证该外部变量发生了什么以及是否有其他东西可以修改它。我不知道细节,如果你喜欢这里有一些聊天。

但是,如果您所做的只是创建一个textBitmap变量并为其分配一些东西,那么修复非常简单:

// Assign it as a result of the expression - no need to create a var first and keep
// changing the value, no need for a temporary null value, it can just be a val
val textBitmap: Bitmap? =
    dynamicItem.dynamicText[imageKey]?.let { drawingText ->
        dynamicItem.dynamicTextPaint[imageKey]?.let { drawingTextPaint ->
            drawTextCache[imageKey]
            ?: Bitmap.createBitmap(drawingBitmap.width, drawingBitmap.height, Bitmap.Config.ARGB_8888).apply {
                    val drawRect = Rect(0, 0, drawingBitmap.width, drawingBitmap.height)
                    val textCanvas = Canvas(this)
                    drawingTextPaint.isAntiAlias = true
                    val fontMetrics = drawingTextPaint.getFontMetrics();
                    val top = fontMetrics.top
                    val bottom = fontMetrics.bottom
                    val baseLineY = drawRect.centerY() - top / 2 - bottom / 2
                    textCanvas.drawText(drawingText, drawRect.centerX().toFloat(), baseLineY, drawingTextPaint);
                    drawTextCache.put(imageKey, this)
            }
        }
    }   

我建议将位图创建部分分解为它自己的函数以提高可读性,并且我个人会避免嵌套let的 s (因为在什么情况下你得到的不是很明显),但这是一种风格选择

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档