Кэширование образа Firebase Storage с помощью Glide в Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Кэширование образа Firebase Storage с помощью Glide в Jetpack Compose

Сообщение Anonymous »

Код: Выделить всё

@OptIn(ExperimentalMaterial3Api::class, ExperimentalGlideComposeApi::class)
@Composable
fun ProfileScreen(
navigate: (String) -> Unit,
viewModel: ProfileViewModel = hiltViewModel()
) {
// code

val result by viewModel.profilePicUrl.collectAsState()

// code

Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
GlideImage(
model = result,
contentDescription = null,
modifier = Modifier
.size(170.dp, 170.dp)
.clip(CircleShape)
.clickable {
showBottomSheet = true
},
) { image ->
image
.fitCenter()
.circleCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.profilepic)
}

// button

}

// some more code
}
This is my UI

Код: Выделить всё

@HiltViewModel
class ProfileViewModel @Inject constructor(
// dependencies
) : ViewModel() {
private val _profilePicUrl = MutableStateFlow("")
val profilePicUrl: StateFlow = _profilePicUrl

init {
viewModelScope.launch {
_profilePicUrl.value = getUserData("profileImage").toString()
}
}

fun updateProfilePic(bitmap: Bitmap) {
viewModelScope.launch {
uploadImageToFirebase(bitmap)
}
}

private suspend fun getUserData(fieldName: String): Any? {
return withContext(Dispatchers.IO) {
try {
userRepository.getCurrentUserData(fieldName)
} catch (_: Exception) {
null
}
}
}

private suspend fun saveUserData(fieldName: String, data: Any): Boolean {
return userRepository.saveUserData(fieldName, data)
}

private suspend fun uploadImageToFirebase(imageUri: Bitmap) {
userRepository.uploadImageToFirebaseStorage(imageUri)
_profilePicUrl.emit(getUserData("profileImage").toString())
}

fun removeProfilePicture() {
// code
}

private fun getRandomDefaultImage(): String {
val randomImages = arrayOf(
// 2 links
)

return randomImages.random()
}
}

ViewModel

Код: Выделить всё

@HiltAndroidApp
class MelonFeedApp : Application() {
override fun onCreate() {
super.onCreate()
Glide.with(this)
.applyDefaultRequestOptions(RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
}
}
ApplicationClass
Здесь я хочу, чтобы, когда у пользователя нет Интернета, его изображение профиля также загружалось в приложение из кеша. Для кеширования я использую Glide, но он работает не так, как ожидалось. Изображение не загружается при отсутствии интернета. Изображение загружается, если есть Интернет.
Возможно, проблема в том, что при отсутствии Интернета приложение пытается получить изображение из базы данных, но не может его получить, поэтому значение _profilePicUrl остается пустым, поэтому я получаю предупреждение

Не удалось загрузить [] с размерами [468x468]
класс com.bumptech .glide.load.engine.GlideException: не удалось загрузить ресурс


Подробнее здесь: https://stackoverflow.com/questions/784 ... ck-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»