feat: Implement image cache eviction for S3 images and enhance image loading error handling.
This commit is contained in:
@@ -126,33 +126,32 @@ class _ChangePasswordTabState extends ConsumerState<ChangePasswordTab> {
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 14),
|
||||
SizedBox(
|
||||
height: 38,
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
obscureText: obscure,
|
||||
style: const TextStyle(
|
||||
fontFamily: 'SourceSerif4',
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: AppColors.primaryDark,
|
||||
),
|
||||
decoration: InputDecoration(
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(horizontal: 26, vertical: 8),
|
||||
border: border,
|
||||
enabledBorder: border,
|
||||
focusedBorder: border,
|
||||
suffixIcon: GestureDetector(
|
||||
onTap: onToggle,
|
||||
child: Icon(
|
||||
obscure ? Icons.visibility_off_outlined : Icons.visibility_outlined,
|
||||
size: 18,
|
||||
color: AppColors.primaryDark.withValues(alpha: 0.5),
|
||||
),
|
||||
TextField(
|
||||
controller: controller,
|
||||
obscureText: obscure,
|
||||
textAlignVertical: TextAlignVertical.center,
|
||||
style: const TextStyle(
|
||||
fontFamily: 'SourceSerif4',
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: AppColors.primaryDark,
|
||||
),
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
contentPadding:
|
||||
const EdgeInsets.fromLTRB(12, 12, 8, 12),
|
||||
border: border,
|
||||
enabledBorder: border,
|
||||
focusedBorder: border,
|
||||
suffixIcon: GestureDetector(
|
||||
onTap: onToggle,
|
||||
child: Icon(
|
||||
obscure ? Icons.visibility_off_outlined : Icons.visibility_outlined,
|
||||
size: 18,
|
||||
color: AppColors.primaryDark.withValues(alpha: 0.5),
|
||||
),
|
||||
suffixIconConstraints: const BoxConstraints(minWidth: 40),
|
||||
),
|
||||
suffixIconConstraints: const BoxConstraints(minWidth: 40),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:real_estate_mobile/core/constants/app_colors.dart';
|
||||
import 'package:real_estate_mobile/core/utils/image_url_resolver.dart';
|
||||
import 'package:real_estate_mobile/core/widgets/s3_image.dart';
|
||||
import 'package:real_estate_mobile/features/profile/data/profile_repository.dart';
|
||||
import 'package:real_estate_mobile/features/profile/presentation/providers/profile_provider.dart';
|
||||
@@ -99,6 +101,13 @@ class _ProfileSettingsTabState extends ConsumerState<ProfileSettingsTab> {
|
||||
avatarUrl = user?['avatar'] as String?;
|
||||
}
|
||||
|
||||
// Evict stale presigned URL cache and disk cache for the avatar
|
||||
// so S3Image always resolves a fresh presigned URL on profile load.
|
||||
if (avatarUrl != null && avatarUrl.isNotEmpty) {
|
||||
ImageUrlResolver.instance.evict(avatarUrl);
|
||||
CachedNetworkImage.evictFromCache(avatarUrl);
|
||||
}
|
||||
|
||||
final descriptionText = isAgent
|
||||
? 'This information will be displayed on your public agent page.'
|
||||
: 'This information will be displayed on your profile.';
|
||||
|
||||
Reference in New Issue
Block a user