From d6204db5c4a9c421e4a8b1c33d689646ea16028c Mon Sep 17 00:00:00 2001 From: Patrick Britton Date: Sun, 8 Feb 2026 14:58:53 -0600 Subject: [PATCH] fix: prevent setState after pop with _popped guard, remove snackbar from compose to prevent scaffold corruption on Android --- .../lib/screens/compose/compose_screen.dart | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/sojorn_app/lib/screens/compose/compose_screen.dart b/sojorn_app/lib/screens/compose/compose_screen.dart index 86fd6c8..c85c331 100644 --- a/sojorn_app/lib/screens/compose/compose_screen.dart +++ b/sojorn_app/lib/screens/compose/compose_screen.dart @@ -39,6 +39,7 @@ class _ComposeScreenState extends ConsumerState { bool _isLoading = false; bool _isUploadingImage = false; + bool _popped = false; String? _errorMessage; String? _blockedMessage; final int _maxCharacters = 500; @@ -458,32 +459,32 @@ class _ComposeScreenState extends ConsumerState { isNsfw: _isNsfw, ); - if (mounted) { + if (mounted && !_popped) { + _popped = true; ref.read(feedRefreshProvider.notifier).increment(); - // Show snackbar BEFORE pop — after pop the context is defunct on web - sojornSnackbar.showSuccess( - context: context, - message: 'Post published', - ); - if (mounted) Navigator.of(context).pop(true); + Navigator.of(context).pop(true); + return; // Skip finally setState — widget is being disposed } } on ToneCheckException { - setState(() { - _errorMessage = - 'Content verification temporarily unavailable. Please try again.'; - }); + if (mounted && !_popped) { + setState(() { + _errorMessage = + 'Content verification temporarily unavailable. Please try again.'; + }); + } } catch (e) { + if (!mounted || _popped) return; final msg = e.toString().replaceAll('Exception: ', ''); // Server-side blocklist catch (422 with blocked content message) if (msg.contains("isn't allowed on Sojorn") || msg.contains('not allowed')) { - if (mounted) setState(() => _blockedMessage = msg); + setState(() => _blockedMessage = msg); } else { setState(() { _errorMessage = msg; }); } } finally { - if (mounted) { + if (mounted && !_popped) { setState(() { _isLoading = false; });