From 0e10866fb5c12e1e4fdadd41683fcfa4a0a27f3a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 18 Jan 2021 11:02:16 +0900 Subject: [PATCH] various insets fixes --- .../collection/thumbnail_collection.dart | 1 + .../common/gesture_area_protector.dart | 23 +++-- lib/widgets/drawer/app_drawer.dart | 84 ++++++++++--------- .../filter_grids/common/filter_grid_page.dart | 1 + lib/widgets/search/search_page.dart | 9 +- lib/widgets/viewer/info/info_page.dart | 1 + lib/widgets/viewer/panorama_page.dart | 6 +- 7 files changed, 73 insertions(+), 52 deletions(-) diff --git a/lib/widgets/collection/thumbnail_collection.dart b/lib/widgets/collection/thumbnail_collection.dart index f5530347b..cdc36a635 100644 --- a/lib/widgets/collection/thumbnail_collection.dart +++ b/lib/widgets/collection/thumbnail_collection.dart @@ -44,6 +44,7 @@ class ThumbnailCollection extends StatelessWidget { Widget build(BuildContext context) { return HighlightInfoProvider( child: SafeArea( + bottom: false, child: LayoutBuilder( builder: (context, constraints) { final viewportSize = constraints.biggest; diff --git a/lib/widgets/common/gesture_area_protector.dart b/lib/widgets/common/gesture_area_protector.dart index 33a736d6b..0fb879ded 100644 --- a/lib/widgets/common/gesture_area_protector.dart +++ b/lib/widgets/common/gesture_area_protector.dart @@ -1,4 +1,7 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; // This widget should be added on top of Scaffolds with: // - `resizeToAvoidBottomInset` set to false, @@ -11,12 +14,20 @@ class BottomGestureAreaProtector extends StatelessWidget { @override Widget build(BuildContext context) { - return Positioned( - left: 0, - right: 0, - bottom: 0, - height: systemGestureInsetsBottom, - child: AbsorbPointer(), + return Selector( + selector: (c, mq) => max(mq.viewPadding.bottom, mq.viewInsets.bottom), + builder: (c, mqPaddingBottom, child) { + // devices with physical navigation buttons have no bottom insets + // we assume these devices do not use gesture navigation + if (mqPaddingBottom == 0) return SizedBox(); + return Positioned( + left: 0, + right: 0, + bottom: 0, + height: systemGestureInsetsBottom, + child: AbsorbPointer(), + ); + }, ); } } diff --git a/lib/widgets/drawer/app_drawer.dart b/lib/widgets/drawer/app_drawer.dart index 1daea1536..22358d397 100644 --- a/lib/widgets/drawer/app_drawer.dart +++ b/lib/widgets/drawer/app_drawer.dart @@ -1,3 +1,4 @@ +import 'dart:math'; import 'dart:ui'; import 'package:aves/model/filters/album.dart'; @@ -38,10 +39,52 @@ class _AppDrawerState extends State { @override Widget build(BuildContext context) { - final header = Container( + final drawerItems = [ + _buildHeader(context), + allCollectionTile, + videoTile, + favouriteTile, + _buildSpecialAlbumSection(), + Divider(), + albumListTile, + countryListTile, + tagListTile, + Divider(), + settingsTile, + aboutTile, + if (kDebugMode) ...[ + Divider(), + debugTile, + ], + ]; + + return Drawer( + child: Selector( + selector: (c, mq) => max(mq.viewPadding.bottom, mq.viewInsets.bottom), + builder: (c, mqPaddingBottom, child) { + return SingleChildScrollView( + padding: EdgeInsets.only(bottom: mqPaddingBottom), + child: Theme( + data: Theme.of(context).copyWith( + // color used by `ExpansionTile` for leading icon + unselectedWidgetColor: Colors.white, + ), + child: Column( + children: drawerItems, + ), + ), + ); + }, + ), + ); + } + + Widget _buildHeader(BuildContext context) { + return Container( padding: EdgeInsets.all(16), color: Theme.of(context).accentColor, child: SafeArea( + bottom: false, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -66,45 +109,6 @@ class _AppDrawerState extends State { ), ), ); - - final drawerItems = [ - header, - allCollectionTile, - videoTile, - favouriteTile, - _buildSpecialAlbumSection(), - Divider(), - albumListTile, - countryListTile, - tagListTile, - Divider(), - settingsTile, - aboutTile, - if (kDebugMode) ...[ - Divider(), - debugTile, - ], - ]; - - return Drawer( - child: Selector( - selector: (c, mq) => mq.viewInsets.bottom, - builder: (c, mqViewInsetsBottom, child) { - return SingleChildScrollView( - padding: EdgeInsets.only(bottom: mqViewInsetsBottom), - child: Theme( - data: Theme.of(context).copyWith( - // color used by `ExpansionTile` for leading icon - unselectedWidgetColor: Colors.white, - ), - child: Column( - children: drawerItems, - ), - ), - ); - }, - ), - ); } Widget _buildAlbumTile(String album) { diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index b03997e9b..42387d473 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -72,6 +72,7 @@ class FilterGridPage extends StatelessWidget { child: HighlightInfoProvider( child: GestureAreaProtectorStack( child: SafeArea( + bottom: false, child: LayoutBuilder( builder: (context, constraints) { final viewportSize = constraints.biggest; diff --git a/lib/widgets/search/search_page.dart b/lib/widgets/search/search_page.dart index ef3c3e933..e85ced83d 100644 --- a/lib/widgets/search/search_page.dart +++ b/lib/widgets/search/search_page.dart @@ -71,9 +71,12 @@ class _SearchPageState extends State { } void _onQueryChanged() { - _debouncer(() => setState(() { - // rebuild ourselves because query changed. - })); + _debouncer(() { + if (mounted) { + // rebuild ourselves because query changed. + setState(() {}); + } + }); } void _onSearchBodyChanged() { diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart index 7f6bf741c..14364b425 100644 --- a/lib/widgets/viewer/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -43,6 +43,7 @@ class _InfoPageState extends State { child: Scaffold( body: GestureAreaProtectorStack( child: SafeArea( + bottom: false, child: NotificationListener( onNotification: _handleTopScroll, child: Selector>( diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index d1e44385b..2eb5d03fb 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -97,10 +97,10 @@ class _PanoramaPageState extends State { return Visibility( visible: overlayVisible, child: Selector( - selector: (c, mq) => mq.padding + mq.viewInsets, - builder: (c, mqViewInsets, child) { + selector: (c, mq) => mq.viewPadding + mq.viewInsets, + builder: (c, mqPadding, child) { return Padding( - padding: EdgeInsets.all(8) + EdgeInsets.only(right: mqViewInsets.right, bottom: mqViewInsets.bottom), + padding: EdgeInsets.all(8) + EdgeInsets.only(right: mqPadding.right, bottom: mqPadding.bottom), child: OverlayButton( scale: kAlwaysCompleteAnimation, child: ValueListenableBuilder(