Update profile image in status after change
All checks were successful
Build Flutter Web and Docker Image for Local Registry / Build Flutter Web App (push) Successful in 3m10s

This commit is contained in:
whysman 2024-11-10 02:40:47 -05:00
parent b8dd01fc37
commit f475c69402
2 changed files with 82 additions and 71 deletions

View File

@ -17,55 +17,20 @@ void main() {
); );
} }
class MyApp extends StatefulWidget { class MyApp extends StatelessWidget {
const MyApp({super.key}); const MyApp({super.key});
@override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
Future<void>? _prefsReady;
bool isProfileActive = false;
bool showProfileInitially = false;
@override
void initState() {
super.initState();
// Retrieve SharedPreferencesProvider instance outside async function
final prefsProvider =
Provider.of<SharedPreferencesProvider>(context, listen: false);
_prefsReady = prefsProvider.ready;
_prefsReady!.then((_) {
// Ensure the widget is still mounted before updating state
if (mounted) {
setState(() {
// Check if the username is not set, then show ProfileScreen initially
showProfileInitially = prefsProvider.getUserName().isEmpty;
});
}
});
}
void toggleProfileScreen() {
setState(() {
isProfileActive = !isProfileActive;
});
}
void closeInitialProfileScreen() {
setState(() {
showProfileInitially = false;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
title: 'Pogdark', title: 'Pogdark',
theme: ThemeData( theme: _buildTheme(),
home: const HomeScreen(),
);
}
ThemeData _buildTheme() {
return ThemeData(
primarySwatch: Colors.blue, primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity, visualDensity: VisualDensity.adaptivePlatformDensity,
elevatedButtonTheme: ElevatedButtonThemeData( elevatedButtonTheme: ElevatedButtonThemeData(
@ -76,8 +41,48 @@ class MyAppState extends State<MyApp> {
), ),
), ),
), ),
), );
home: FutureBuilder( }
}
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
HomeScreenState createState() => HomeScreenState();
}
class HomeScreenState extends State<HomeScreen> {
late Future<void> _prefsReady;
bool isProfileActive = false;
bool showProfileInitially = false;
@override
void initState() {
super.initState();
final prefsProvider =
Provider.of<SharedPreferencesProvider>(context, listen: false);
_prefsReady = prefsProvider.ready.then((_) {
if (mounted) {
setState(() {
showProfileInitially = prefsProvider.getUserName().isEmpty;
});
}
});
}
void toggleProfileScreen() {
setState(() => isProfileActive = !isProfileActive);
}
void closeInitialProfileScreen() {
setState(() => showProfileInitially = false);
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _prefsReady, future: _prefsReady,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
@ -85,37 +90,44 @@ class MyAppState extends State<MyApp> {
children: [ children: [
StatusPage(toggleProfile: toggleProfileScreen), StatusPage(toggleProfile: toggleProfileScreen),
if (showProfileInitially) if (showProfileInitially)
BackdropFilter( ProfileOverlay(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: Container(
color: Colors.black.withOpacity(0.3),
child: Center(
child: ProfileScreen(
isEditing: false, isEditing: false,
onClose: closeInitialProfileScreen, onClose: closeInitialProfileScreen,
), ),
),
),
),
if (isProfileActive && !showProfileInitially) if (isProfileActive && !showProfileInitially)
BackdropFilter( ProfileOverlay(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: Container(
color: Colors.black.withOpacity(0.3),
child: Center(
child: ProfileScreen(
isEditing: true, isEditing: true,
onClose: toggleProfileScreen, onClose: toggleProfileScreen,
), ),
),
),
),
], ],
); );
} else { } else {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} }
}, },
);
}
}
class ProfileOverlay extends StatelessWidget {
final bool isEditing;
final VoidCallback onClose;
const ProfileOverlay(
{super.key, required this.isEditing, required this.onClose});
@override
Widget build(BuildContext context) {
return BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: Container(
color: Colors.black.withOpacity(0.3),
child: Center(
child: ProfileScreen(
isEditing: isEditing,
onClose: onClose,
),
),
), ),
); );
} }

View File

@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/web_socket_channel.dart';
@ -24,7 +23,7 @@ class StatusPageState extends State<StatusPage> {
late final Stream<dynamic> broadcastStream; late final Stream<dynamic> broadcastStream;
late StreamController<dynamic> controller; late StreamController<dynamic> controller;
List<Map<String, dynamic>> messages = []; List<Map<String, dynamic>> messages = [];
final Map<String, ImageProvider> _imageCache = {}; // Cache for decoded images final Map<String, ImageProvider> _imageCache = {};
@override @override
void initState() { void initState() {
@ -81,12 +80,12 @@ class StatusPageState extends State<StatusPage> {
await prefsProvider.setCurrentStatus(''); await prefsProvider.setCurrentStatus('');
} else { } else {
messages.add(message); messages.add(message);
_cacheImage(incomingId, image); // Cache image on message receive _cacheImage(incomingId, image);
} }
} }
void _cacheImage(String id, String? base64Image) { void _cacheImage(String id, String? base64Image) {
if (base64Image != null && !_imageCache.containsKey(id)) { if (base64Image != null) {
_imageCache[id] = Image.memory(base64Decode(base64Image)).image; _imageCache[id] = Image.memory(base64Decode(base64Image)).image;
} }
} }