6.9 KiB
Bug Fix - Hub Status Showing "Connected" When Connection Fails
🐛 Bug Reported
Issue: "If it's unable to connect to SignalR, why does it say hub status connected?"
What was happening: Even when SignalR failed to connect (due to CORS or any other error), the UI footer was showing:
Hub Status: Connected ✅
This was misleading and made debugging difficult.
🔍 Root Cause Analysis
Problem 1: Initial State Was true
File: /lib/view_models/screen_config_view_model.dart (Line 207)
bool isHubConnected = true; // ❌ Wrong! Started as true by default
The hub status was initialized to true even before attempting to connect.
Problem 2: Connection Result Not Used
File: /lib/view_models/queuing_view_model.dart (Line 45-60)
Future<bool?> startHubConnection() async {
return await signalrRepo.startHubConnection(...); // ❌ Returned but not used to update status
}
When startHubConnection() returned false (connection failed), the status wasn't being updated.
Problem 3: No Initial Status Reset
File: /lib/view_models/queuing_view_model.dart (Line 35-43)
Future<void> initializeQueueingVM() async {
await startHubConnection(); // ❌ No initial status set
// ...
}
The initialization didn't explicitly set the status to disconnected before attempting to connect.
✅ Fixes Applied
Fix 1: Changed Initial State to false
File: /lib/view_models/screen_config_view_model.dart
bool isHubConnected = false; // ✅ Start as disconnected until connection succeeds
Why: The app should assume disconnected until proven connected.
Fix 2: Update Status Based on Connection Result
File: /lib/view_models/queuing_view_model.dart
Future<bool?> startHubConnection() async {
try {
ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
final result = await signalrRepo.startHubConnection(...);
// ✅ Update hub connection status based on result
if (result == true) {
screenConfigViewModel.updateIsHubConnected(true);
loggerService.logToFile(message: "Hub connection successful", ...);
} else {
screenConfigViewModel.updateIsHubConnected(false);
loggerService.logToFile(message: "Hub connection failed - result: $result", ...);
}
return result;
} catch (e, st) {
// ✅ On error, mark as disconnected
ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
screenConfigViewModel.updateIsHubConnected(false);
// ...
}
}
Why: The connection status should accurately reflect the result of the connection attempt.
Fix 3: Set Initial Status in Initialization
File: /lib/view_models/queuing_view_model.dart
Future<void> initializeQueueingVM() async {
try {
// ✅ Mark as disconnected initially
ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
screenConfigViewModel.updateIsHubConnected(false);
// ✅ Attempt to connect (will update status based on result)
await startHubConnection();
// ...
}
}
Why: Clear initialization prevents race conditions and ensures consistent state.
🎯 Expected Behavior After Fix
Scenario 1: Successful Connection (Mobile)
1. App starts
→ Hub Status: Disconnected ❌
2. Attempting SignalR connection...
→ Hub Status: Disconnected ❌
3. Connection successful!
→ Hub Status: Connected ✅
Scenario 2: Failed Connection (Web - CORS)
1. App starts
→ Hub Status: Disconnected ❌
2. Attempting SignalR connection...
→ Hub Status: Disconnected ❌
3. Connection fails (CORS error)
→ Hub Status: Disconnected ❌ ← Stays disconnected!
Scenario 3: Connection Lost
1. Connected and running
→ Hub Status: Connected ✅
2. Network issue / Server restart
→ onHubDisconnected() called
→ Hub Status: Disconnected ❌
3. Auto-reconnect attempts...
→ Hub Status: Disconnected ❌
4. Reconnection successful
→ onHubReconnected() called
→ Hub Status: Connected ✅
🧪 How to Test
Test 1: Web (CORS Blocked)
- Open web app
- Check footer: Should show "Hub Status: Disconnected" ❌
- Check logs: Should show "Hub connection failed"
Test 2: Mobile (Working)
- Open mobile app
- Wait for connection
- Check footer: Should show "Hub Status: Connected" ✅
- Check logs: Should show "Hub connection successful"
Test 3: Connection Loss
- Start mobile app (connected)
- Turn off network
- Check footer: Should change to "Disconnected" ❌
- Turn on network
- Check footer: Should change back to "Connected" ✅
📊 Status Flow Diagram
Before Fix:
App Start → isHubConnected = true ✅ (WRONG!)
→ Attempt connection
→ Connection fails
→ isHubConnected = true ✅ (Still shows connected!)
After Fix:
App Start → isHubConnected = false ❌
→ Attempt connection
→ Connection fails
→ Update status: false ❌ (Correctly shows disconnected!)
App Start → isHubConnected = false ❌
→ Attempt connection
→ Connection succeeds
→ Update status: true ✅ (Correctly shows connected!)
📝 Code Changes Summary
| File | Lines Changed | Description |
|---|---|---|
screen_config_view_model.dart |
207 | Changed isHubConnected initial value from true to false |
queuing_view_model.dart |
35-43 | Added initial status reset in initializeQueueingVM() |
queuing_view_model.dart |
45-82 | Updated startHubConnection() to set status based on result |
🎯 Impact
User Experience
- ✅ More accurate status display: Users see the real connection state
- ✅ Better troubleshooting: Clear indication when connection fails
- ✅ No false positives: Won't show "Connected" when it's actually disconnected
Developer Experience
- ✅ Easier debugging: Logs now show accurate connection status
- ✅ Clear state management: Status updates are explicit and traceable
- ✅ Consistent behavior: All connection paths update status correctly
Web Platform
- ✅ CORS errors visible: Footer now correctly shows "Disconnected" when CORS blocks connection
- ✅ Clear user feedback: Users can see that connection failed
- ✅ Better error reporting: Status matches logs and actual state
✅ Verification Checklist
- Initial state is
false(disconnected) - Status updates to
trueon successful connection - Status updates to
falseon failed connection - Status updates to
falseon connection error - Logging added for status changes
- No compiler errors
- Existing functionality preserved
Date: August 2, 2026
Status: ✅ FIXED
Files Modified: 2
Impact: High (affects all platforms)