From a069345fb48715914ea07660d85cb6798bfd8b0c Mon Sep 17 00:00:00 2001 From: tamslo Date: Thu, 21 Nov 2024 14:31:53 +0100 Subject: [PATCH] feat(#708): remove focus on route change --- app/lib/app.dart | 15 ++++++++++++++- app/lib/common/widgets/page_scaffold.dart | 9 ++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/lib/app.dart b/app/lib/app.dart index 6c59547e..ed745287 100644 --- a/app/lib/app.dart +++ b/app/lib/app.dart @@ -22,7 +22,10 @@ class PharMeApp extends StatelessWidget { child: MaterialApp.router( debugShowCheckedModeBanner: false, routeInformationParser: _appRouter.defaultRouteParser(), - routerDelegate: _appRouter.delegate(deepLinkBuilder: getInitialRoute), + routerDelegate: _appRouter.delegate( + deepLinkBuilder: getInitialRoute, + navigatorObservers: () => [RemoveFocusOnNavigate()], + ), theme: PharMeTheme.light, localizationsDelegates: [ AppLocalizations.delegate, @@ -36,3 +39,13 @@ class PharMeApp extends StatelessWidget { ); } } + +// Based on https://github.com/flutter/flutter/issues/48464#issuecomment-586635827 +class RemoveFocusOnNavigate extends NavigatorObserver { + @override + void didPush(Route route, Route? previousRoute) { + super.didPush(route, previousRoute); + final focus = FocusManager.instance.primaryFocus; + focus?.unfocus(); + } +} diff --git a/app/lib/common/widgets/page_scaffold.dart b/app/lib/common/widgets/page_scaffold.dart index a4aa1443..9c4554af 100644 --- a/app/lib/common/widgets/page_scaffold.dart +++ b/app/lib/common/widgets/page_scaffold.dart @@ -62,6 +62,11 @@ Scaffold pageScaffold({ ); } +void _maybeRemoveFocus(BuildContext? contextToDismissFocusOnTap) => + contextToDismissFocusOnTap != null + ? FocusScope.of(contextToDismissFocusOnTap).unfocus() + : null; + Widget unscrollablePageScaffold({ required Widget body, String? title, @@ -86,9 +91,7 @@ Widget unscrollablePageScaffold({ titleSpacing: _getTitleSpacing(backButtonPresent: canNavigateBack), ); return GestureDetector( - onTap: () => contextToDismissFocusOnTap != null - ? FocusScope.of(contextToDismissFocusOnTap).unfocus() - : null, + onTap: () => _maybeRemoveFocus(contextToDismissFocusOnTap), child: Scaffold( key: key, appBar: appBar,