diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 7cfa92611..e56eae76a 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -18,6 +18,7 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/view/view.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/collection/entry_set_action_delegate.dart'; import 'package:aves/widgets/collection/filter_bar.dart'; @@ -56,7 +57,7 @@ class CollectionAppBar extends StatefulWidget { State createState() => _CollectionAppBarState(); } -class _CollectionAppBarState extends State with SingleTickerProviderStateMixin, WidgetsBindingObserver { +class _CollectionAppBarState extends State with RouteAware, SingleTickerProviderStateMixin, WidgetsBindingObserver { final Set _subscriptions = {}; final EntrySetActionDelegate _actionDelegate = EntrySetActionDelegate(); late AnimationController _browseToSelectAnimation; @@ -122,6 +123,15 @@ class _CollectionAppBarState extends State with SingleTickerPr }); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final route = ModalRoute.of(context); + if (route is PageRoute) { + AvesApp.pageRouteObserver.subscribe(this, route); + } + } + @override void didUpdateWidget(covariant CollectionAppBar oldWidget) { super.didUpdateWidget(oldWidget); @@ -140,6 +150,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ..forEach((sub) => sub.cancel()) ..clear(); WidgetsBinding.instance.removeObserver(this); + AvesApp.pageRouteObserver.unsubscribe(this); super.dispose(); } @@ -151,6 +162,13 @@ class _CollectionAppBarState extends State with SingleTickerPr widget.collection.filterChangeNotifier.removeListener(_onFilterChanged); } + @override + void didPushNext() { + // unfocus when navigating away, so that when navigating back, + // the query bar does not get back focus and bring the keyboard + _queryBarFocusNode.unfocus(); + } + @override void didChangeMetrics() { // when top padding or text scale factor change diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart index 680ab82bc..d0f838afe 100644 --- a/lib/widgets/filter_grids/common/app_bar.dart +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -11,6 +11,7 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/themes.dart'; import 'package:aves/view/view.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/action_controls/togglers/title_search.dart'; import 'package:aves/widgets/common/app_bar/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar/app_bar_title.dart'; @@ -78,7 +79,7 @@ class FilterGridAppBar> extends State> with SingleTickerProviderStateMixin, WidgetsBindingObserver { +class _FilterGridAppBarState> extends State> with RouteAware, SingleTickerProviderStateMixin, WidgetsBindingObserver { final Set _subscriptions = {}; late AnimationController _browseToSelectAnimation; final ValueNotifier _isSelectingNotifier = ValueNotifier(false); @@ -112,6 +113,15 @@ class _FilterGridAppBarState _updateAppBarHeight()); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final route = ModalRoute.of(context); + if (route is PageRoute) { + AvesApp.pageRouteObserver.subscribe(this, route); + } + } + @override void dispose() { _queryBarFocusNode.dispose(); @@ -122,9 +132,17 @@ class _FilterGridAppBarState sub.cancel()) ..clear(); WidgetsBinding.instance.removeObserver(this); + AvesApp.pageRouteObserver.unsubscribe(this); super.dispose(); } + @override + void didPushNext() { + // unfocus when navigating away, so that when navigating back, + // the query bar does not get back focus and bring the keyboard + _queryBarFocusNode.unfocus(); + } + @override void didChangeMetrics() { // when text scale factor changes