当我构建我的项目时,我得到了这个错误
下面是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)
}
我不知道如何解决它
基本上静态编程语言不能智能地将text Bitmap
转换为lambda中的非空位图
。您可能在Canvas(text Bitmap)
调用中遇到错误,它不能接受空参数,并且编译器不能保证text Bitmap
在那一刻不为空。
这是lambda引用外部var
s的限制,可以更改-我认为这是因为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(因为在什么情况下你会得到什么并不明显),但这是一种风格选择
而不是像这样做嵌套的<code>let
kotlin prettyprint-override">val drawingText = dynamicItem.dynamicText[imageKey] ?: return // or you could assign an empty string `?: "" `
val drawingTextPaint = dynamicItem.dynamicTextPaint[imageKey] ?: return
val textBitmap: Bitmap = drawTextCache[imageKey] ?: Bitmap.createBitmap(drawingBitmap.width, drawingBitmap.height, Bitmap.Config.ARGB_8888).applyCanvas {
val drawRect = Rect(0, 0, drawingBitmap.width, drawingBitmap.height)
val fontMetrics = drawingTextPaint.getFontMetrics()
val top = fontMetrics.top
val bottom = fontMetrics.bottom
val baseLineY = drawRect.centerY() - top / 2 - bottom / 2
drawingTextPaint.isAntiAlias = true
drawText(drawingText, drawRect.centerX().toFloat(), baseLineY, drawingTextPaint);
}
drawTextCache.put(imageKey, textBitmap)
我知道这个问题以前有人问过,但似乎没有解决方案。我正在尝试使用名为的int变量来跟踪的顶部可见项目,该变量通过将视图的标记(类型“Any”)转换为Int来填充:
为了简化我的真实用例,让我们假设我想在一个列表中找到最大的数字: 但是,编译失败并出现以下错误: 智能强制转换为“Int”是不可能的,因为“max”是一个由变化的闭包捕获的局部变量 为什么更改的闭包会阻止智能强制转换在此示例中起作用?
我正在尝试在 Kotlin 中生成一个单例,并且遇到了问题,因为我无法。 这似乎是制作单例的一种非常标准的方法。为什么它不让我,我该如何解决它?
我试图得到一个类,它结合了< code>Kotlin中的列表、集合和映射。我希望编写< code>isScalar函数,如果对象只包含一个元素,它应该返回< code>true 不幸的是,相比之下,它给了我一个错误 说着 据我所知,这与多线程假设有关。在Java,如果期望多线程,我会使函数。此外,如果我不编写线程安全的,我可以完全忽略这一点。 静态编程语言应该怎么写? 我看到了这个解决方案http
我还在另一个类中使用了bitmap2和Bitmap1: 这里写着:类型不匹配,必需:位图找到:位图?
智能转换为“GridLayoutManager”是不可能的,因为“ViewManager”是一个可变属性,此时可能已更改 是错误,AndroidStudio显示时,试图添加一个除法器到我的回收视图。 PixelsFragment.kt 我找到了这个答案,它说这样的问题可能是因为在执行该行时变量可能碰巧为< code>null,然后他们提供了3个解决方案。然而,根据我的理解,< code>viewM