various insets fixes

This commit is contained in:
Thibault Deckers 2021-01-18 11:02:16 +09:00
parent 33f00daa35
commit 0e10866fb5
7 changed files with 73 additions and 52 deletions

View file

@ -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;

View file

@ -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<MediaQueryData, double>(
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(),
);
},
);
}
}

View file

@ -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<AppDrawer> {
@override
Widget build(BuildContext context) {
final header = Container(
final drawerItems = <Widget>[
_buildHeader(context),
allCollectionTile,
videoTile,
favouriteTile,
_buildSpecialAlbumSection(),
Divider(),
albumListTile,
countryListTile,
tagListTile,
Divider(),
settingsTile,
aboutTile,
if (kDebugMode) ...[
Divider(),
debugTile,
],
];
return Drawer(
child: Selector<MediaQueryData, double>(
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<AppDrawer> {
),
),
);
final drawerItems = <Widget>[
header,
allCollectionTile,
videoTile,
favouriteTile,
_buildSpecialAlbumSection(),
Divider(),
albumListTile,
countryListTile,
tagListTile,
Divider(),
settingsTile,
aboutTile,
if (kDebugMode) ...[
Divider(),
debugTile,
],
];
return Drawer(
child: Selector<MediaQueryData, double>(
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) {

View file

@ -72,6 +72,7 @@ class FilterGridPage<T extends CollectionFilter> extends StatelessWidget {
child: HighlightInfoProvider(
child: GestureAreaProtectorStack(
child: SafeArea(
bottom: false,
child: LayoutBuilder(
builder: (context, constraints) {
final viewportSize = constraints.biggest;

View file

@ -71,9 +71,12 @@ class _SearchPageState extends State<SearchPage> {
}
void _onQueryChanged() {
_debouncer(() => setState(() {
// rebuild ourselves because query changed.
}));
_debouncer(() {
if (mounted) {
// rebuild ourselves because query changed.
setState(() {});
}
});
}
void _onSearchBodyChanged() {

View file

@ -43,6 +43,7 @@ class _InfoPageState extends State<InfoPage> {
child: Scaffold(
body: GestureAreaProtectorStack(
child: SafeArea(
bottom: false,
child: NotificationListener(
onNotification: _handleTopScroll,
child: Selector<MediaQueryData, Tuple2<double, double>>(

View file

@ -97,10 +97,10 @@ class _PanoramaPageState extends State<PanoramaPage> {
return Visibility(
visible: overlayVisible,
child: Selector<MediaQueryData, EdgeInsets>(
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<SensorControl>(