You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HMG_QLine/IP_PERSISTENCE_FIX.md

4.0 KiB

IP Persistence Fix - Page Reload Issue

Problem

When the web page reloads (browser refresh), the device IP was not being retrieved from localStorage, showing as empty string "" instead.

Root Causes Identified

  1. No immediate localStorage check on startup - The app was entering detection loop before checking if IP was already saved
  2. Potential localStorage access errors - No error handling for localStorage operations
  3. Race conditions - localStorage might not be checked before other detection methods

Fixes Applied

1. screen_config_view_model.dart

  • ✅ Added immediate localStorage check at the start of waitForIPAndInitializeConfigVM()
    • Checks localStorage BEFORE entering the detection loop
    • If IP found, initializes immediately and returns
    • Logs when IP is found vs not found
  • ✅ Added try-catch around all localStorage operations
  • ✅ Better error logging for localStorage access failures

2. connectivity_service.dart

  • ✅ Added comprehensive logging in getCurrentScreenIP()
    • Logs storedIp value, type, and all conditions checked
    • Shows exactly why localStorage check passed or failed
  • ✅ Added try-catch around localStorage read/write operations
  • ✅ Better error messages when localStorage access fails

3. splash_screen.dart

  • ✅ Enhanced logging in _reloadWithIp()
    • Logs before and after save
    • Verifies saved value matches input
    • Shows localStorage keys
    • Warns if verification fails
  • ✅ Added try-catch around localStorage operations

4. ip_config_dialog.dart

  • ✅ Added try-catch in _submitIp()
  • ✅ Enhanced verification logging
    • Confirms save operation
    • Warns if verification fails

Flow After Fix

On Page Reload (Browser Refresh):

  1. App starts fresh (all Dart state cleared, localStorage persists)
  2. SplashScreen loads → _loadData() called
  3. waitForIPAndInitializeConfigVM() called
  4. 🆕 IMMEDIATE localStorage check (NEW!)
    if (kIsWeb && currentScreenIP == "") {
      final storedIp = html.window.localStorage['device_ip'];
      if (storedIp != null && storedIp.isNotEmpty && storedIp != 'null') {
        currentScreenIP = storedIp;
        initializeScreenConfigVM();
        return; // ✅ IP found, initialize immediately!
      }
    }
    
  5. If IP found → Initialize immediately ✅
  6. If not found → Enter detection loop (URL param → localStorage → auto-detect)

On IP Configuration:

  1. User enters IP in dialog
  2. Saved to localStorage with verification
  3. Set in viewModel
  4. Re-initialize with saved IP

Benefits

  • ✅ Instant load on page reload (no detection delay if IP already saved)
  • ✅ Better error handling (won't fail silently)
  • ✅ Comprehensive logging (easy to debug if issues persist)
  • ✅ Multiple safeguards (checks localStorage in multiple places)

Testing Checklist

  1. ✅ Configure IP via dialog → Reload page → Should load instantly with saved IP
  2. ✅ Configure IP via URL ?ip=X.X.X.X → Reload without URL param → Should load with saved IP
  3. ✅ Clear localStorage → Reload → Should show IP config dialog
  4. ✅ Check browser console for detailed logs showing localStorage access

Console Logs to Look For

Success (IP Found):

✅ IP retrieved from localStorage on startup: 10.71.50.53
💾 Saved IP to localStorage: 10.71.50.53

Failure (IP Not Found):

⚠️ No IP found in localStorage on startup (storedIp: "null")
🔍 Checking localStorage for saved IP...
⚠️ localStorage check failed - storedIp: "null"

Verification:

💾 Saved IP to localStorage in splash: 10.71.50.53
   Verify: saved == ip: true
   localStorage keys: [device_ip, ...]

Files Modified

  1. /lib/view_models/screen_config_view_model.dart
  2. /lib/services/connectivity_service.dart
  3. /lib/views/splash_screen/splash_screen.dart
  4. /lib/views/common_widgets/ip_config_dialog.dart

Date: August 2, 2026
Status: ✅ FIXED - Ready for testing