diff --git a/lib/profile_screen.dart b/lib/profile_screen.dart index f965130..2b75073 100644 --- a/lib/profile_screen.dart +++ b/lib/profile_screen.dart @@ -25,6 +25,7 @@ class ProfileScreenState extends State { late String? imageData; bool isNameEmpty = true; final ImagePicker _picker = ImagePicker(); + Image? _cachedImage; // Cache the Image widget @override void initState() { @@ -33,8 +34,8 @@ class ProfileScreenState extends State { Provider.of(context, listen: false); _nameController.text = prefsProvider.getUserName(); imageData = prefsProvider.getUserLogo(); + _cachedImage = _buildLogoImage(imageData); // Initialize the cached image - // Check initial state of the name field and add listener _nameController.addListener(_checkNameField); isNameEmpty = _nameController.text.trim().isEmpty; } @@ -58,9 +59,9 @@ class ProfileScreenState extends State { if (mounted) { final prefsProvider = Provider.of(context, listen: false); - prefsProvider - .setUserLogo(base64Encode(imageBytes)); // Cache the image imageData = base64Encode(imageBytes); + prefsProvider.setUserLogo(imageData!); // Cache the image data + _cachedImage = _buildLogoImage(imageData); // Update the cached image } }); } @@ -74,7 +75,6 @@ class ProfileScreenState extends State { await prefsProvider.setUserName(name); await prefsProvider.setUserLogo(imageData); - // Close the screen after saving if the name is valid widget.onClose(); } else { ScaffoldMessenger.of(context).showSnackBar( @@ -91,7 +91,7 @@ class ProfileScreenState extends State { super.dispose(); } - Image getLogoImage(String? logo) { + Image _buildLogoImage(String? logo) { if (logo != null) { return Image.memory(base64Decode(logo)); } else { @@ -101,9 +101,6 @@ class ProfileScreenState extends State { @override Widget build(BuildContext context) { - final prefsProvider = Provider.of(context); - final userLogo = prefsProvider.getUserLogo(); - return Center( child: Material( color: Colors.white, @@ -136,7 +133,7 @@ class ProfileScreenState extends State { const SizedBox(height: 20), CircleAvatar( radius: 50, - backgroundImage: getLogoImage(userLogo).image, + backgroundImage: _cachedImage?.image, ), const SizedBox(height: 20), TextField( diff --git a/lib/status_page.dart b/lib/status_page.dart index e2b1e2b..ff0715d 100644 --- a/lib/status_page.dart +++ b/lib/status_page.dart @@ -23,8 +23,8 @@ class StatusPageState extends State { late final Stream broadcastStream; late StreamController controller; - - List> messages = []; // To hold user messages + List> messages = []; + final Map _imageCache = {}; // Cache for decoded images @override void initState() { @@ -44,14 +44,11 @@ class StatusPageState extends State { if (!mounted) return; - // Check if the status is already active; if so, clear it, otherwise set it final isStatusActive = prefsProvider.getCurrentStatus() == status; final newStatus = isStatusActive ? '' : status; - // Update the status in SharedPreferences await prefsProvider.setCurrentStatus(newStatus); - // Send the message to the WebSocket final message = jsonEncode({ 'Id': id, 'Name': name, @@ -76,18 +73,29 @@ class StatusPageState extends State { final status = message['Status']; final incomingId = message['Id']; + final image = message['Image']; messages.removeWhere((msg) => msg['Id'] == incomingId); - // Check if the message status is "expired" and update SharedPreferences if (status == 'expired') { await prefsProvider.setCurrentStatus(''); } else { messages.add(message); + _cacheImage(incomingId, image); // Cache image on message receive + } + } + + void _cacheImage(String id, String? base64Image) { + if (base64Image != null && !_imageCache.containsKey(id)) { + _imageCache[id] = Image.memory(base64Decode(base64Image)).image; } } Widget _buildMessageItem(Map message) { + final imageId = message['Id']; + final imageProvider = _imageCache[imageId] ?? + const AssetImage('assets/default_profile_image.png'); + return Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), child: Align( @@ -105,9 +113,7 @@ class StatusPageState extends State { children: [ CircleAvatar( radius: 20, - backgroundImage: message['Image'] != null - ? Image.memory(base64Decode(message['Image'])).image - : const AssetImage('assets/default_profile_image.png'), + backgroundImage: imageProvider, ), const SizedBox(width: 8), Text( @@ -129,14 +135,12 @@ class StatusPageState extends State { ); } - // Function to get the background color based on the current status Color getButtonColor(String buttonStatus) { final prefsProvider = Provider.of(context); final currentStatus = prefsProvider.getCurrentStatus(); return currentStatus == buttonStatus ? Colors.blueAccent : Colors.grey; } - // Function to get the text color based on the current status Color getButtonTextColor(String buttonStatus) { final prefsProvider = Provider.of(context); final currentStatus = prefsProvider.getCurrentStatus(); @@ -265,6 +269,7 @@ class StatusPageState extends State { @override void dispose() { channel.sink.close(); + controller.close(); super.dispose(); } }