diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index de39d7e..6f22c5e 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -959,7 +959,12 @@ class MeshCoreConnector extends ChangeNotifier { if (!isConnected) return; if (_batteryRequested && !force) return; _batteryRequested = true; - await sendFrame(buildGetBattAndStorageFrame()); + try { + await sendFrame(buildGetBattAndStorageFrame()); + } catch (e) { + // Connection likely lost - trigger disconnection handling + _handleDisconnection(); + } } void _startBatteryPolling() { diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index 63f4a3c..0d38d98 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -8,9 +8,47 @@ import '../widgets/device_tile.dart'; import 'contacts_screen.dart'; /// Screen for scanning and connecting to MeshCore devices -class ScannerScreen extends StatelessWidget { +class ScannerScreen extends StatefulWidget { const ScannerScreen({super.key}); + @override + State createState() => _ScannerScreenState(); +} + +class _ScannerScreenState extends State { + bool _changedNavigation = false; + late final VoidCallback _connectionListener; + + @override + void initState() { + super.initState(); + final connector = Provider.of(context, listen: false); + + _connectionListener = () { + if (connector.state == MeshCoreConnectionState.disconnected) { + _changedNavigation = false; + } else if (connector.state == MeshCoreConnectionState.connected && !_changedNavigation) { + _changedNavigation = true; + if (mounted) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const ContactsScreen(), + ), + ); + } + } + }; + + connector.addListener(_connectionListener); + } + + @override + void dispose() { + final connector = Provider.of(context, listen: false); + connector.removeListener(_connectionListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -161,15 +199,6 @@ final l10n = context.l10n; ? result.device.platformName : result.advertisementData.advName; await connector.connect(result.device, displayName: name); - - if (context.mounted && connector.isConnected) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const ContactsScreen(), - ), - ); - } } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar(