From 58cb1a5ef9caefdbb8da5df0c67375662b8fe205 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:31:48 +0530 Subject: [PATCH 1/5] fix avoid context access after widget disposal --- app/lib/core/app_shell.dart | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/app/lib/core/app_shell.dart b/app/lib/core/app_shell.dart index c51d3c793d..f022540f7a 100644 --- a/app/lib/core/app_shell.dart +++ b/app/lib/core/app_shell.dart @@ -55,17 +55,19 @@ class _AppShellState extends State { } if (uri.pathSegments.first == 'apps') { - if (mounted) { - var app = await context.read().getAppFromId(uri.pathSegments[1]); - if (app != null) { - PlatformManager.instance.mixpanel.track('App Opened From DeepLink', properties: {'appId': app.id}); - if (mounted) { - Navigator.of(context).push(MaterialPageRoute(builder: (context) => AppDetailPage(app: app))); - } - } else { - debugPrint('App not found: ${uri.pathSegments[1]}'); - AppSnackbar.showSnackbarError('Oops! Looks like the app you are looking for is not available.'); + final appProvider = context.read(); + final app = await appProvider.getAppFromId(uri.pathSegments[1]); + + if (!mounted) return; + + if (app != null) { + PlatformManager.instance.mixpanel.track('App Opened From DeepLink', properties: {'appId': app.id}); + if (mounted) { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => AppDetailPage(app: app))); } + } else { + debugPrint('App not found: ${uri.pathSegments[1]}'); + AppSnackbar.showSnackbarError('Oops! Looks like the app you are looking for is not available.'); } } else if (uri.pathSegments.first == 'wrapped') { if (mounted) { @@ -364,7 +366,11 @@ class _AppShellState extends State { initDeepLinks(); WidgetsBinding.instance.addPostFrameCallback((_) async { - if (context.read().isSignedIn()) { + if (!mounted) return; + + final auth = context.read(); + + if (auth.isSignedIn()) { context.read().setupHasSpeakerProfile(); context.read().setupUserPrimaryLanguage(); context.read().initialize(); @@ -375,6 +381,8 @@ class _AppShellState extends State { debugPrint('Failed to login to Intercom: $e'); } + if (!mounted) return; + context.read().setMessagesFromCache(); context.read().setAppsFromCache(); context.read().refreshMessages(); @@ -387,7 +395,10 @@ class _AppShellState extends State { await PlatformManager.instance.intercom.loginUnidentifiedUser(); } } - PlatformManager.instance.intercom.setUserAttributes(); + + if (mounted) { + PlatformManager.instance.intercom.setUserAttributes(); + } }); super.initState(); } From 18da5c5d17cc2009e4f270ee3ca98933046c5390 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:48:35 +0530 Subject: [PATCH 2/5] extract providers --- app/lib/core/app_shell.dart | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/app/lib/core/app_shell.dart b/app/lib/core/app_shell.dart index f022540f7a..a32ffcaf57 100644 --- a/app/lib/core/app_shell.dart +++ b/app/lib/core/app_shell.dart @@ -371,10 +371,13 @@ class _AppShellState extends State { final auth = context.read(); if (auth.isSignedIn()) { - context.read().setupHasSpeakerProfile(); - context.read().setupUserPrimaryLanguage(); - context.read().initialize(); - context.read().initialize(); + final homeProvider = context.read(); + final userProvider = context.read(); + final peopleProvider = context.read(); + homeProvider.setupHasSpeakerProfile(); + homeProvider.setupUserPrimaryLanguage(); + userProvider.initialize(); + peopleProvider.initialize(); try { await PlatformManager.instance.intercom.loginIdentifiedUser(SharedPreferencesUtil().uid); } catch (e) { @@ -383,12 +386,16 @@ class _AppShellState extends State { if (!mounted) return; - context.read().setMessagesFromCache(); - context.read().setAppsFromCache(); - context.read().refreshMessages(); - context.read().fetchSubscription(); - context.read().loadFromBackend(); + final messageProvider = context.read(); + final appProvider = context.read(); + final usageProvider = context.read(); + final taskIntegrationProvider = context.read(); + messageProvider.setMessagesFromCache(); + appProvider.setAppsFromCache(); + messageProvider.refreshMessages(); + usageProvider.fetchSubscription(); + taskIntegrationProvider.loadFromBackend(); NotificationService.instance.saveNotificationToken(); } else { if (!PlatformManager.instance.isAnalyticsSupported) { From ec7451a0d1dd72781b37a1fa56efbc24aef123b9 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Sun, 11 Jan 2026 10:29:25 +0530 Subject: [PATCH 3/5] remove extra mounted check --- app/lib/core/app_shell.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/lib/core/app_shell.dart b/app/lib/core/app_shell.dart index a32ffcaf57..bb18be4f96 100644 --- a/app/lib/core/app_shell.dart +++ b/app/lib/core/app_shell.dart @@ -366,7 +366,6 @@ class _AppShellState extends State { initDeepLinks(); WidgetsBinding.instance.addPostFrameCallback((_) async { - if (!mounted) return; final auth = context.read(); @@ -402,10 +401,7 @@ class _AppShellState extends State { await PlatformManager.instance.intercom.loginUnidentifiedUser(); } } - - if (mounted) { - PlatformManager.instance.intercom.setUserAttributes(); - } + PlatformManager.instance.intercom.setUserAttributes(); }); super.initState(); } From ee3d53c08e717127f3d15b13de3fbe60f755802f Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Sun, 11 Jan 2026 10:35:06 +0530 Subject: [PATCH 4/5] remove mounted check --- app/lib/core/app_shell.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/lib/core/app_shell.dart b/app/lib/core/app_shell.dart index bb18be4f96..a86415bea6 100644 --- a/app/lib/core/app_shell.dart +++ b/app/lib/core/app_shell.dart @@ -62,9 +62,7 @@ class _AppShellState extends State { if (app != null) { PlatformManager.instance.mixpanel.track('App Opened From DeepLink', properties: {'appId': app.id}); - if (mounted) { Navigator.of(context).push(MaterialPageRoute(builder: (context) => AppDetailPage(app: app))); - } } else { debugPrint('App not found: ${uri.pathSegments[1]}'); AppSnackbar.showSnackbarError('Oops! Looks like the app you are looking for is not available.'); From 7008d00acef9bb3ca6d730a7e6bd31c88d954b25 Mon Sep 17 00:00:00 2001 From: Krushna Kanta Rout <129386740+krushnarout@users.noreply.github.com> Date: Sun, 11 Jan 2026 10:36:22 +0530 Subject: [PATCH 5/5] format --- app/lib/core/app_shell.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/lib/core/app_shell.dart b/app/lib/core/app_shell.dart index a86415bea6..1a65506311 100644 --- a/app/lib/core/app_shell.dart +++ b/app/lib/core/app_shell.dart @@ -62,7 +62,7 @@ class _AppShellState extends State { if (app != null) { PlatformManager.instance.mixpanel.track('App Opened From DeepLink', properties: {'appId': app.id}); - Navigator.of(context).push(MaterialPageRoute(builder: (context) => AppDetailPage(app: app))); + Navigator.of(context).push(MaterialPageRoute(builder: (context) => AppDetailPage(app: app))); } else { debugPrint('App not found: ${uri.pathSegments[1]}'); AppSnackbar.showSnackbarError('Oops! Looks like the app you are looking for is not available.'); @@ -364,7 +364,6 @@ class _AppShellState extends State { initDeepLinks(); WidgetsBinding.instance.addPostFrameCallback((_) async { - final auth = context.read(); if (auth.isSignedIn()) {