various insets fixes
This commit is contained in:
parent
33f00daa35
commit
0e10866fb5
7 changed files with 73 additions and 52 deletions
|
@ -44,6 +44,7 @@ class ThumbnailCollection extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return HighlightInfoProvider(
|
return HighlightInfoProvider(
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: LayoutBuilder(
|
child: LayoutBuilder(
|
||||||
builder: (context, constraints) {
|
builder: (context, constraints) {
|
||||||
final viewportSize = constraints.biggest;
|
final viewportSize = constraints.biggest;
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
// This widget should be added on top of Scaffolds with:
|
// This widget should be added on top of Scaffolds with:
|
||||||
// - `resizeToAvoidBottomInset` set to false,
|
// - `resizeToAvoidBottomInset` set to false,
|
||||||
|
@ -11,12 +14,20 @@ class BottomGestureAreaProtector extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Positioned(
|
return Selector<MediaQueryData, double>(
|
||||||
left: 0,
|
selector: (c, mq) => max(mq.viewPadding.bottom, mq.viewInsets.bottom),
|
||||||
right: 0,
|
builder: (c, mqPaddingBottom, child) {
|
||||||
bottom: 0,
|
// devices with physical navigation buttons have no bottom insets
|
||||||
height: systemGestureInsetsBottom,
|
// we assume these devices do not use gesture navigation
|
||||||
child: AbsorbPointer(),
|
if (mqPaddingBottom == 0) return SizedBox();
|
||||||
|
return Positioned(
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
height: systemGestureInsetsBottom,
|
||||||
|
child: AbsorbPointer(),
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'dart:math';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:aves/model/filters/album.dart';
|
import 'package:aves/model/filters/album.dart';
|
||||||
|
@ -38,10 +39,52 @@ class _AppDrawerState extends State<AppDrawer> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
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),
|
padding: EdgeInsets.all(16),
|
||||||
color: Theme.of(context).accentColor,
|
color: Theme.of(context).accentColor,
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
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) {
|
Widget _buildAlbumTile(String album) {
|
||||||
|
|
|
@ -72,6 +72,7 @@ class FilterGridPage<T extends CollectionFilter> extends StatelessWidget {
|
||||||
child: HighlightInfoProvider(
|
child: HighlightInfoProvider(
|
||||||
child: GestureAreaProtectorStack(
|
child: GestureAreaProtectorStack(
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: LayoutBuilder(
|
child: LayoutBuilder(
|
||||||
builder: (context, constraints) {
|
builder: (context, constraints) {
|
||||||
final viewportSize = constraints.biggest;
|
final viewportSize = constraints.biggest;
|
||||||
|
|
|
@ -71,9 +71,12 @@ class _SearchPageState extends State<SearchPage> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onQueryChanged() {
|
void _onQueryChanged() {
|
||||||
_debouncer(() => setState(() {
|
_debouncer(() {
|
||||||
// rebuild ourselves because query changed.
|
if (mounted) {
|
||||||
}));
|
// rebuild ourselves because query changed.
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onSearchBodyChanged() {
|
void _onSearchBodyChanged() {
|
||||||
|
|
|
@ -43,6 +43,7 @@ class _InfoPageState extends State<InfoPage> {
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
body: GestureAreaProtectorStack(
|
body: GestureAreaProtectorStack(
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: NotificationListener(
|
child: NotificationListener(
|
||||||
onNotification: _handleTopScroll,
|
onNotification: _handleTopScroll,
|
||||||
child: Selector<MediaQueryData, Tuple2<double, double>>(
|
child: Selector<MediaQueryData, Tuple2<double, double>>(
|
||||||
|
|
|
@ -97,10 +97,10 @@ class _PanoramaPageState extends State<PanoramaPage> {
|
||||||
return Visibility(
|
return Visibility(
|
||||||
visible: overlayVisible,
|
visible: overlayVisible,
|
||||||
child: Selector<MediaQueryData, EdgeInsets>(
|
child: Selector<MediaQueryData, EdgeInsets>(
|
||||||
selector: (c, mq) => mq.padding + mq.viewInsets,
|
selector: (c, mq) => mq.viewPadding + mq.viewInsets,
|
||||||
builder: (c, mqViewInsets, child) {
|
builder: (c, mqPadding, child) {
|
||||||
return Padding(
|
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(
|
child: OverlayButton(
|
||||||
scale: kAlwaysCompleteAnimation,
|
scale: kAlwaysCompleteAnimation,
|
||||||
child: ValueListenableBuilder<SensorControl>(
|
child: ValueListenableBuilder<SensorControl>(
|
||||||
|
|
Loading…
Reference in a new issue