From 2cd9b6c80da4505fcc75d03d8038d72e4bf51cc5 Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Mon, 27 Jul 2026 21:23:03 +0300 Subject: [PATCH] fix(ui): always pop DDL loading overlay Capture NavigatorState before await and pop loading even when the host widget unmounts mid-fetch (extension + SQLite table views). Closes #447 --- lib/features/extensions/extension_table_view.dart | 5 +++-- lib/features/sqlite/sqlite_table_view.dart | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/features/extensions/extension_table_view.dart b/lib/features/extensions/extension_table_view.dart index e62f572a..38ca00e7 100644 --- a/lib/features/extensions/extension_table_view.dart +++ b/lib/features/extensions/extension_table_view.dart @@ -177,6 +177,7 @@ class _ExtensionTableViewState extends material.State { } Future _openDdlDialog() async { + final navigator = material.Navigator.of(context, rootNavigator: true); unawaited(showAppDialog( context: context, barrierDismissible: false, @@ -191,8 +192,8 @@ class _ExtensionTableViewState extends material.State { nodeId: widget.tableName, nodeType: widget.isView ? 'view' : 'table', ); + if (navigator.canPop()) navigator.pop(); if (!mounted) return; - material.Navigator.of(context).pop(); final ddlText = meta.ddl?.trim().isNotEmpty == true ? meta.ddl! @@ -223,8 +224,8 @@ class _ExtensionTableViewState extends material.State { ), ); } catch (e) { + if (navigator.canPop()) navigator.pop(); if (!mounted) return; - material.Navigator.of(context).pop(); showAppToast( context: context, message: 'Failed to fetch DDL: $e', diff --git a/lib/features/sqlite/sqlite_table_view.dart b/lib/features/sqlite/sqlite_table_view.dart index fd3f4f7d..28d0e395 100644 --- a/lib/features/sqlite/sqlite_table_view.dart +++ b/lib/features/sqlite/sqlite_table_view.dart @@ -194,6 +194,7 @@ class _SqliteTableViewState extends material.State { Future _showDdlDialog() async { final conn = _connection; if (conn == null || !conn.isConnected) return; + final navigator = material.Navigator.of(context, rootNavigator: true); unawaited(showAppDialog( context: context, barrierDismissible: false, @@ -203,8 +204,8 @@ class _SqliteTableViewState extends material.State { )); try { final ddl = await conn.getObjectDdl(widget.tableName); + if (navigator.canPop()) navigator.pop(); if (!mounted) return; - material.Navigator.of(context).pop(); await showAppDialog( context: context, builder: (ctx) => material.AlertDialog( @@ -230,8 +231,8 @@ class _SqliteTableViewState extends material.State { ), ); } catch (e) { + if (navigator.canPop()) navigator.pop(); if (!mounted) return; - material.Navigator.of(context).pop(); showAppToast( context: context, message: 'Failed to fetch DDL: $e',