[英]Coil Kotlin Uri to Bitmap throws null pointer exception
嘗試在 Kotlin 中將Uri
圖像文件轉換為Bitmap
失敗,並出現空指針異常。 我怎樣才能解決這個問題?
var bitmap = remember { mutableStateOf<Bitmap?>(null)}
LaunchedEffect(key1 = "tobitmap") {
CoroutineScope(Dispatchers.IO).launch {
bitmap.value = uriToBitmap(
context,
shoppingListScreenViewModel.state.value.imageUri
)
}
}
Image(
bitmap = bitmap.value?.asImageBitmap()!!, //Throws exception here
contentDescription = ""
)
private suspend fun uriToBitmap(context: Context, uri: Uri?): Bitmap {
val loader = ImageLoader(context)
val request = ImageRequest.Builder(context)
.data(uri)
.allowHardware(false) // Disable hardware bitmaps.
.build()
val result = (loader.execute(request) as SuccessResult).drawable
val bitmap = (result as BitmapDrawable).bitmap
val resizedBitmap = Bitmap.createScaledBitmap(
bitmap, 80, 80, true);
return resizedBitmap
}
var bitmap = remember { mutableStateOf<Bitmap?>(null)}
在這里, bitmap.value
將為null
。
Image(
bitmap = bitmap.value?.asImageBitmap()!!, //Throws exception here
contentDescription = ""
)
在這里, bitmap.value?.asImageBitmap()
將為null
,因為bitmap.value
為null
。 因此,一旦執行此代碼,您就會崩潰並出現NullPointerException
。
最終, bitmap.value
不會是null
,由您的LaunchedEffect
提供,但這需要一些時間。 您需要返工您的可組合物以便能夠在該時間點之前工作。
bitmap = bitmap.value?.asImageBitmap()!!, //Throws exception here
非空斷言不是處理這個問題的好方法。
您可能的選項是顯示圖像
bitmap?.value?.asImageBitmap()?.let{ imageBitmap->
Image(...)
}
並等待創建位圖,而您什么也不顯示
或最好顯示一個Composable
的加載或帶有占位符的Image
。
if(bitmap.value!= null) {
Image(...)
} else {
// Your loading Composable
}
另一種選擇是使用SubcomposeAsyncImage
,它具有用於加載、錯誤和成功可組合插槽的插槽,因此您可以在這些插槽中傳遞您的可組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.