Warum wird Coil 3 nicht eine gültige Bild -URL in Jetpack komponieren, obwohl die URL gültig ist und der StateFlow ordnu
Posted: 21 May 2025, 11:14
Ich migriere einen Benutzerprofil-Bildschirm von XML + Glide zu Jetpack, der mit Coil 3.1.0 (io.coil-kt.coil3: Coil-Compose) komponiert wird.https://example.com/img/icon_user.png< /code> ← png über https < /p>
Es ist ein statisches Platzhalterbild, das als Standardprofilsymbol verwendet wird, und lädt in einem Browser einwandfrei. Browser < /li>
Die URL -Aktualisierungen über StateFlow < /code> und die Zusammensetzung des Zusammenhangs treten auf < /li>
Es werden keine Fehler ausgeworfen. ViewModel < /h3>
class UserViewModel : ViewModel() {
private val _imageUrl = MutableStateFlow("")
val imageUrl: StateFlow = _imageUrl
fun loadUserProfile() {
viewModelScope.launch {
userProfileUseCase.execute().collect {
if (it is RequestState.Success) {
val body = it.response.result.body
val url = body.imageUrl
Log.d("UserViewModel", "imageUrl = $url") //
URL is valid
_imageUrl.emit(url ?: "")
}
}
}
}
}
< /code>
komponierbare Verwendung < /h3>
@Composable
fun UserProfileScreen(userViewModel: UserViewModel) {
val imageUrl by userViewModel.imageUrl.collectAsStateWithLifecycle()
UserImageThumbnail(
imageUrl = imageUrl,
onClick = { /* omitted */ }
)
}
< /code>
Bildanzeige komponierbar < /h3>
@Composable
fun UserImageThumbnail(imageUrl: String?, onClick: () -> Unit) {
val context = LocalContext.current
Box(
modifier = Modifier
.size(107.dp)
.clickable { onClick() }
) {
if (!imageUrl.isNullOrBlank()) {
Image(
painter = rememberAsyncImagePainter(
ImageRequest.Builder(context)
.data(imageUrl)
.memoryCachePolicy(CachePolicy.DISABLED)
.diskCachePolicy(CachePolicy.DISABLED)
.build()
),
contentDescription = null,
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
Icon(
painter = painterResource(id = R.drawable.icon_camera),
contentDescription = null,
modifier = Modifier
.align(Alignment.Center)
.size(48.dp)
)
}
}
< /code>
Warum ist Coil 3 nicht eine gültige Bild -URL in Jetpack komponiert, obwohl die URL korrekt ist und die Wiederbelebung komponiert? Dies umfasst sowohl benutzerbezogene Profilbilder als auch Standard-Fallback-Bilder, die immer von der API bereitgestellt werden. Die URL ist also niemals null oder leer. Das Bild wird jedoch nicht angezeigt. Trotzdem wird in Komponsen nichts gezeigt.
Es ist ein statisches Platzhalterbild, das als Standardprofilsymbol verwendet wird, und lädt in einem Browser einwandfrei. Browser < /li>
Die URL -Aktualisierungen über StateFlow < /code> und die Zusammensetzung des Zusammenhangs treten auf < /li>
Es werden keine Fehler ausgeworfen. ViewModel < /h3>
class UserViewModel : ViewModel() {
private val _imageUrl = MutableStateFlow("")
val imageUrl: StateFlow = _imageUrl
fun loadUserProfile() {
viewModelScope.launch {
userProfileUseCase.execute().collect {
if (it is RequestState.Success) {
val body = it.response.result.body
val url = body.imageUrl
Log.d("UserViewModel", "imageUrl = $url") //
_imageUrl.emit(url ?: "")
}
}
}
}
}
< /code>
@Composable
fun UserProfileScreen(userViewModel: UserViewModel) {
val imageUrl by userViewModel.imageUrl.collectAsStateWithLifecycle()
UserImageThumbnail(
imageUrl = imageUrl,
onClick = { /* omitted */ }
)
}
< /code>
@Composable
fun UserImageThumbnail(imageUrl: String?, onClick: () -> Unit) {
val context = LocalContext.current
Box(
modifier = Modifier
.size(107.dp)
.clickable { onClick() }
) {
if (!imageUrl.isNullOrBlank()) {
Image(
painter = rememberAsyncImagePainter(
ImageRequest.Builder(context)
.data(imageUrl)
.memoryCachePolicy(CachePolicy.DISABLED)
.diskCachePolicy(CachePolicy.DISABLED)
.build()
),
contentDescription = null,
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
}
Icon(
painter = painterResource(id = R.drawable.icon_camera),
contentDescription = null,
modifier = Modifier
.align(Alignment.Center)
.size(48.dp)
)
}
}
< /code>
Warum ist Coil 3 nicht eine gültige Bild -URL in Jetpack komponiert, obwohl die URL korrekt ist und die Wiederbelebung komponiert? Dies umfasst sowohl benutzerbezogene Profilbilder als auch Standard-Fallback-Bilder, die immer von der API bereitgestellt werden. Die URL ist also niemals null oder leer. Das Bild wird jedoch nicht angezeigt. Trotzdem wird in Komponsen nichts gezeigt.