From d0f293abb28680f99e8a91faed158d5b89ee7ac7 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 17 May 2022 22:16:38 +0900 Subject: [PATCH] collection / filter pages: extend below status bar --- lib/widgets/collection/app_bar.dart | 25 +++++++++++-- lib/widgets/collection/collection_page.dart | 1 + .../filter_grids/common/filter_grid_page.dart | 36 +++++++++++-------- 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 2ef7861c9..544668b7a 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:ui'; import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/entry_set_actions.dart'; @@ -45,13 +46,14 @@ class CollectionAppBar extends StatefulWidget { State createState() => _CollectionAppBarState(); } -class _CollectionAppBarState extends State with SingleTickerProviderStateMixin { +class _CollectionAppBarState extends State with SingleTickerProviderStateMixin, WidgetsBindingObserver { final List _subscriptions = []; final EntrySetActionDelegate _actionDelegate = EntrySetActionDelegate(); late AnimationController _browseToSelectAnimation; final ValueNotifier _isSelectingNotifier = ValueNotifier(false); final FocusNode _queryBarFocusNode = FocusNode(); late final Listenable _queryFocusRequestNotifier; + double _statusBarHeight = 0; CollectionLens get collection => widget.collection; @@ -76,7 +78,11 @@ class _CollectionAppBarState extends State with SingleTickerPr ); _isSelectingNotifier.addListener(_onActivityChange); _registerWidget(widget); - WidgetsBinding.instance.addPostFrameCallback((_) => _onFilterChanged()); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback((_) { + _updateStatusBarHeight(); + _onFilterChanged(); + }); } @override @@ -95,6 +101,7 @@ class _CollectionAppBarState extends State with SingleTickerPr _subscriptions ..forEach((sub) => sub.cancel()) ..clear(); + WidgetsBinding.instance.removeObserver(this); super.dispose(); } @@ -106,6 +113,11 @@ class _CollectionAppBarState extends State with SingleTickerPr widget.collection.filterChangeNotifier.removeListener(_onFilterChanged); } + @override + void didChangeMetrics() { + _updateStatusBarHeight(); + } + @override Widget build(BuildContext context) { final appMode = context.watch>().value; @@ -418,7 +430,14 @@ class _CollectionAppBarState extends State with SingleTickerPr void _onQueryFocusRequest() => _queryBarFocusNode.requestFocus(); - void _updateAppBarHeight() => widget.appBarHeightNotifier.value = kToolbarHeight + appBarBottomHeight; + void _updateStatusBarHeight() { + _statusBarHeight = EdgeInsets.fromWindowPadding(window.padding, window.devicePixelRatio).top; + _updateAppBarHeight(); + } + + void _updateAppBarHeight() { + widget.appBarHeightNotifier.value = _statusBarHeight + kToolbarHeight + appBarBottomHeight; + } Future _onActionSelected(EntrySetAction action) async { switch (action) { diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 3727d8b06..12a83d967 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -110,6 +110,7 @@ class _CollectionPageState extends State { child: DoubleBackPopScope( child: GestureAreaProtectorStack( child: SafeArea( + top: false, bottom: false, child: ChangeNotifierProvider.value( value: _collection, diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index ad43876c1..bc9c2f95e 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -94,22 +94,28 @@ class FilterGridPage extends StatelessWidget { child: DoubleBackPopScope( child: GestureAreaProtectorStack( child: SafeArea( + top: false, bottom: false, - child: FilterGrid( - // key is expected by test driver - key: const Key('filter-grid'), - settingsRouteKey: settingsRouteKey, - appBar: appBar, - appBarHeight: appBarHeight, - sections: sections, - newFilters: newFilters, - sortFactor: sortFactor, - showHeaders: showHeaders, - selectable: selectable, - queryNotifier: queryNotifier, - applyQuery: applyQuery, - emptyBuilder: emptyBuilder, - heroType: heroType, + child: Selector( + selector: (context, mq) => mq.padding.top, + builder: (context, mqPaddingTop, child) { + return FilterGrid( + // key is expected by test driver + key: const Key('filter-grid'), + settingsRouteKey: settingsRouteKey, + appBar: appBar, + appBarHeight: mqPaddingTop + appBarHeight, + sections: sections, + newFilters: newFilters, + sortFactor: sortFactor, + showHeaders: showHeaders, + selectable: selectable, + queryNotifier: queryNotifier, + applyQuery: applyQuery, + emptyBuilder: emptyBuilder, + heroType: heroType, + ); + }, ), ), ),