From 13421c547124ae46b4a3c86d84a84cfa4743fafc Mon Sep 17 00:00:00 2001 From: DhruvSingh19 Date: Wed, 3 Dec 2025 23:44:01 +0530 Subject: [PATCH 1/2] Fix: Dead-Screen Issue is fixed --- ios/Flutter/ephemeral/flutter_lldb_helper.py | 32 ++++++++++++++++++++ ios/Flutter/ephemeral/flutter_lldbinit | 5 +++ lib/screens/measurement_entries_screen.dart | 25 ++++++++++++--- 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 ios/Flutter/ephemeral/flutter_lldb_helper.py create mode 100644 ios/Flutter/ephemeral/flutter_lldbinit diff --git a/ios/Flutter/ephemeral/flutter_lldb_helper.py b/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 00000000..a88caf99 --- /dev/null +++ b/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/ios/Flutter/ephemeral/flutter_lldbinit b/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 00000000..e3ba6fbe --- /dev/null +++ b/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/lib/screens/measurement_entries_screen.dart b/lib/screens/measurement_entries_screen.dart index 688bd868..aa693b8c 100644 --- a/lib/screens/measurement_entries_screen.dart +++ b/lib/screens/measurement_entries_screen.dart @@ -24,6 +24,7 @@ import 'package:wger/providers/measurement.dart'; import 'package:wger/screens/form_screen.dart'; import 'package:wger/widgets/measurements/entries.dart'; import 'package:wger/widgets/measurements/forms.dart'; +import '../models/measurements/measurement_category.dart'; enum MeasurementOptions { edit, @@ -38,7 +39,20 @@ class MeasurementEntriesScreen extends StatelessWidget { @override Widget build(BuildContext context) { final categoryId = ModalRoute.of(context)!.settings.arguments as int; - final category = Provider.of(context).findCategoryById(categoryId); + final provider = Provider.of(context); + MeasurementCategory? category; + + try { + category = provider.findCategoryById(categoryId); + } catch (e) { + // Category deleted → prevent red screen + Future.microtask(() { + if (Navigator.of(context).canPop()) { + Navigator.of(context).pop(); + } + }); + return const SizedBox(); // Return empty widget until pop happens + } return Scaffold( appBar: AppBar( @@ -65,7 +79,7 @@ class MeasurementEntriesScreen extends StatelessWidget { builder: (BuildContext contextDialog) { return AlertDialog( content: Text( - AppLocalizations.of(context).confirmDelete(category.name), + AppLocalizations.of(context).confirmDelete(category!.name), ), actions: [ TextButton( @@ -84,11 +98,12 @@ class MeasurementEntriesScreen extends StatelessWidget { Provider.of( context, listen: false, - ).deleteCategory(category.id!); - + ).deleteCategory(category!.id!); // Close the popup Navigator.of(contextDialog).pop(); + Navigator.of(context).pop(); // Exit detail screen + // and inform the user ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -138,7 +153,7 @@ class MeasurementEntriesScreen extends StatelessWidget { body: WidescreenWrapper( child: SingleChildScrollView( child: Consumer( - builder: (context, provider, child) => EntriesList(category), + builder: (context, provider, child) => EntriesList(category!), ), ), ), From bc6a8a7273eacf7a226039249af95a5dab224786 Mon Sep 17 00:00:00 2001 From: DhruvSingh19 Date: Thu, 4 Dec 2025 09:46:17 +0530 Subject: [PATCH 2/2] Implemented Copilot's suggestions. --- lib/screens/measurement_entries_screen.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/screens/measurement_entries_screen.dart b/lib/screens/measurement_entries_screen.dart index aa693b8c..550a3238 100644 --- a/lib/screens/measurement_entries_screen.dart +++ b/lib/screens/measurement_entries_screen.dart @@ -19,12 +19,13 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:wger/core/wide_screen_wrapper.dart'; +import 'package:wger/exceptions/no_such_entry_exception.dart'; import 'package:wger/l10n/generated/app_localizations.dart'; +import 'package:wger/models/measurements/measurement_category.dart'; import 'package:wger/providers/measurement.dart'; import 'package:wger/screens/form_screen.dart'; import 'package:wger/widgets/measurements/entries.dart'; import 'package:wger/widgets/measurements/forms.dart'; -import '../models/measurements/measurement_category.dart'; enum MeasurementOptions { edit, @@ -44,10 +45,9 @@ class MeasurementEntriesScreen extends StatelessWidget { try { category = provider.findCategoryById(categoryId); - } catch (e) { - // Category deleted → prevent red screen + } on NoSuchEntryException { Future.microtask(() { - if (Navigator.of(context).canPop()) { + if (context.mounted && Navigator.of(context).canPop()) { Navigator.of(context).pop(); } });