diff --git a/lib/main.dart b/lib/main.dart index bfe9b39..08eafdc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,9 +38,6 @@ void main() async { class JournalerApp extends StatelessWidget { const JournalerApp({super.key}); - static final GlobalKey _mainPageKey = - GlobalKey(); - static final TextTheme _baseTextTheme = const TextTheme( bodyMedium: TextStyle(fontSize: 24), ); @@ -114,30 +111,7 @@ class JournalerApp extends StatelessWidget { theme: lightTheme, darkTheme: darkTheme, themeMode: ThemeMode.system, - home: Focus( - // Using RawKeyboardListener despite deprecation because KeyboardListener - // and Shortcuts/Actions didn't reliably capture the Escape key press - // before the TextField handled it for unfocusing, requiring two presses. - // RawKeyboardListener intercepts the event earlier. - child: RawKeyboardListener( - // Revert to RawKeyboardListener - focusNode: FocusNode(), - onKey: (RawKeyEvent event) { - // Revert to onKey and RawKeyEvent - if (event is RawKeyDownEvent && // Revert to RawKeyDownEvent - event.logicalKey == LogicalKeyboardKey.escape) { - debugPrint("Escape pressed (RawKeyboardListener - Workaround)"); - final state = _mainPageKey.currentState; - if (state != null) { - // Re-add unfocus, as it seemed necessary with Raw listener - FocusManager.instance.primaryFocus?.unfocus(); - state.onWindowClose(); - } - } - }, - child: MainPage(key: _mainPageKey), - ), - ), + home: const MainPage(), debugShowCheckedModeBanner: false, ); } @@ -286,66 +260,81 @@ class MainPageState extends State with WindowListener { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('Journaler'), actions: const []), - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - flex: 9, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Expanded( - child: TextField( - controller: _previousEntryController, - maxLines: null, - expands: true, - style: Theme.of(context).textTheme.bodyMedium, - decoration: const InputDecoration( - labelText: 'Previous Entry', + // Wrap Scaffold with RawKeyboardListener as workaround for Escape key + return RawKeyboardListener( + focusNode: FocusNode(), // Needs its own node + onKey: (RawKeyEvent event) { + if (event is RawKeyDownEvent && + event.logicalKey == LogicalKeyboardKey.escape) { + debugPrint( + "Escape pressed inside MainPage (RawKeyboardListener - Workaround)", + ); + // Call method directly since we are in the state + FocusManager.instance.primaryFocus?.unfocus(); // Keep unfocus attempt + onWindowClose(); + } + }, + child: Scaffold( + appBar: AppBar(title: const Text('Journaler'), actions: const []), + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + flex: 9, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: TextField( + controller: _previousEntryController, + maxLines: null, + expands: true, + style: Theme.of(context).textTheme.bodyMedium, + decoration: const InputDecoration( + labelText: 'Previous Entry', + ), ), ), - ), - const SizedBox(height: 8), - Expanded( - child: TextField( - controller: _currentEntryController, - focusNode: _currentEntryFocusNode, - maxLines: null, - expands: true, - autofocus: true, - style: Theme.of(context).textTheme.bodyMedium, - decoration: const InputDecoration( - labelText: 'Current Entry (What\'s on your mind?)', + const SizedBox(height: 8), + Expanded( + child: TextField( + controller: _currentEntryController, + focusNode: _currentEntryFocusNode, + maxLines: null, + expands: true, + autofocus: true, + style: Theme.of(context).textTheme.bodyMedium, + decoration: const InputDecoration( + labelText: 'Current Entry (What\'s on your mind?)', + ), + onChanged: (text) {}, ), - onChanged: (text) {}, ), - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - flex: 3, - child: TextField( - controller: _todoController, - maxLines: null, - expands: true, - style: - Theme.of( - context, - ).textTheme.bodyMedium, // Apply theme text style - decoration: const InputDecoration( - labelText: 'Todo', - // border: OutlineInputBorder(), // Handled by theme - // contentPadding: EdgeInsets.all(8.0), // Handled by theme or default + ], ), ), - ), - ], + const SizedBox(width: 8), + Expanded( + flex: 3, + child: TextField( + controller: _todoController, + maxLines: null, + expands: true, + style: + Theme.of( + context, + ).textTheme.bodyMedium, // Apply theme text style + decoration: const InputDecoration( + labelText: 'Todo', + // border: OutlineInputBorder(), // Handled by theme + // contentPadding: EdgeInsets.all(8.0), // Handled by theme or default + ), + ), + ), + ], + ), ), ), );