我有一個存盤庫類,在其中創建 Firestore 呼叫以獲取影像 URL:
override suspend fun getImageUrl() = flow {
try {
emit(Response.Loading)
val imageUrl = ref.document(id).get().await().getString("imageUrl")
emit(Response.Success(imageUrl))
} catch (e: Exception) {
emit(Response.Failure(e))
}
}
在 ViewModel 類中,我有一個 State 物件,我在其中設定 URL,如下所示:
var imageUrlState = mutableStateOf<Response<String>>(Response.Success(null))
init {
getImageUrl()
}
fun getImageUrl() {
viewModelScope.launch {
repo.getImageUrl().collect { response ->
imageUrlState.value = response
}
}
}
在我的 ProfileScreen 里面我有這個:
@Composable
fun ProfileScreen(
viewModel: ImageUrlViewModel = hiltViewModel()
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
AsyncImage(
model = ImageRequest.Builder(LocalContext.current)
.data(viewModel.imageUrlState.value) //?? Doesn't work!!!
.crossfade(true)
.build(),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.clip(CircleShape).width(96.dp).height(96.dp)
)
}
}
這就是我為跟蹤錯誤所做的:
when(val response = viewModel.imageUrlState.value) {
is Response.Loading -> ProgressBar()
is Response.Success -> Unit
is Response.Failure -> LaunchedEffect(Unit) {
print(response.e)
}
}
問題是我從資料庫中正確獲取了 URL,但影像未在 AsyncImage 上呈現。我檢查了 URL 并在瀏覽器中正確打開?如何克服這種情況?
uj5u.com熱心網友回復:
要查看線圈請求失敗的原因,您可以使用listener:
ImageRequest.Builder(LocalContext.current)
.listener(
one rror = { request, result ->
println(result.throwable)
}
)
我的假設是,當viewModel.imageUrlState.value您將Response物件傳遞給 Coil 時,您需要打開它并傳遞包含的 URL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481599.html
標籤:安卓 火力基地 科特林 android-jetpack-compose 线圈
上一篇:在KotlinMutliplatform專案中的Actual/Expect類中傳遞Android/iOS特定引數
