Added functionality to reconnect if the application lifecycle changes (i.e visibility)
All checks were successful
Build Flutter Web and Docker Image for Local Registry / Build Flutter Web App (push) Successful in 7m58s

This commit is contained in:
whysman 2024-11-10 19:32:20 -05:00
parent 300a597155
commit c5eef02ce1

View File

@ -17,12 +17,8 @@ class StatusPage extends StatefulWidget {
StatusPageState createState() => StatusPageState();
}
class StatusPageState extends State<StatusPage> {
final WebSocketChannel channel = WebSocketChannel.connect(
Uri.parse('wss://api.pogdark.com:8889/ws'),
//Uri.parse('ws://localhost:8080/ws'),
);
class StatusPageState extends State<StatusPage> with WidgetsBindingObserver {
WebSocketChannel? channel;
late final Stream<dynamic> broadcastStream;
late StreamController<dynamic> controller;
List<Map<String, dynamic>> messages = [];
@ -31,9 +27,42 @@ class StatusPageState extends State<StatusPage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
_initializeWebSocket();
}
void _initializeWebSocket() {
channel = WebSocketChannel.connect(
Uri.parse('wss://api.pogdark.com:8889/ws'),
//Uri.parse('ws://localhost:8080/ws'),
);
controller = StreamController<dynamic>.broadcast();
controller.addStream(channel.stream);
broadcastStream = channel.stream.asBroadcastStream();
controller.addStream(channel!.stream);
broadcastStream = channel!.stream.asBroadcastStream();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
channel?.sink.close();
controller.close();
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
// Reestablish the WebSocket connection when the app returns to the foreground
_reconnectWebSocket();
}
}
void _reconnectWebSocket() {
if (channel != null) {
channel!.sink.close();
}
_initializeWebSocket();
}
List<Map<String, dynamic>> _getMessagesByStatus(String status) {
@ -58,7 +87,7 @@ class StatusPageState extends State<StatusPage> {
'Status': newStatus.isEmpty ? 'expired' : newStatus,
'Timestamp': DateTime.now().toIso8601String(),
});
channel.sink.add(message);
channel!.sink.add(message);
if (mounted) {
Fluttertoast.showToast(
@ -277,11 +306,4 @@ class StatusPageState extends State<StatusPage> {
),
);
}
@override
void dispose() {
channel.sink.close();
controller.close();
super.dispose();
}
}