diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 7ccf6725e..5959b4745 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -21,12 +21,15 @@ import 'package:provider/provider.dart'; enum FeedbackType { info, warn } +typedef MarginComputer = EdgeInsets Function(BuildContext context); + mixin FeedbackMixin { - static final ValueNotifier snackBarMarginOverrideNotifier = ValueNotifier(null); + static final ValueNotifier snackBarMarginOverrideNotifier = ValueNotifier(null); static EdgeInsets snackBarMarginDefault(BuildContext context) { - final mq = context.read(); - return EdgeInsets.only(bottom: max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom)); + return EdgeInsets.only( + bottom: context.select((mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom)), + ); } void dismissFeedback(BuildContext context) => ScaffoldMessenger.of(context).hideCurrentSnackBar(); @@ -69,11 +72,12 @@ mixin FeedbackMixin { notificationOverlayEntry = showOverlayNotification( (context) => SafeArea( bottom: false, - child: ValueListenableBuilder( + child: ValueListenableBuilder( valueListenable: snackBarMarginOverrideNotifier, - builder: (context, margin, child) { + builder: (context, marginComputer, child) { + final margin = (marginComputer ?? snackBarMarginDefault).call(context); return AnimatedPadding( - padding: margin ?? snackBarMarginDefault(context), + padding: margin, duration: ADurations.pageTransitionAnimation, child: child, ); diff --git a/lib/widgets/viewer/entry_viewer_page.dart b/lib/widgets/viewer/entry_viewer_page.dart index feaaffa2d..71442a9fc 100644 --- a/lib/widgets/viewer/entry_viewer_page.dart +++ b/lib/widgets/viewer/entry_viewer_page.dart @@ -24,10 +24,6 @@ class EntryViewerPage extends StatefulWidget { @override State createState() => _EntryViewerPageState(); - static EdgeInsets snackBarMargin(BuildContext context) { - return EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context)); - } - static Color getBackground(BuildContext context) => Theme.of(context).isDark ? Colors.black : Colors.white; } diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 75d06532b..82a2444de 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -312,11 +312,13 @@ class _EntryViewerStackState extends State with EntryViewContr void didPushNext() => _resetSnackBarMargin(); void _overrideSnackBarMargin() { + MarginComputer marginComputer; if (isViewingImage) { - FeedbackMixin.snackBarMarginOverrideNotifier.value = EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context)); + marginComputer = (context) => EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context)); } else { - FeedbackMixin.snackBarMarginOverrideNotifier.value = FeedbackMixin.snackBarMarginDefault(context); + marginComputer = FeedbackMixin.snackBarMarginDefault; } + FeedbackMixin.snackBarMarginOverrideNotifier.value = marginComputer; } void _resetSnackBarMargin() => FeedbackMixin.snackBarMarginOverrideNotifier.value = null; diff --git a/lib/widgets/viewer/overlay/bottom.dart b/lib/widgets/viewer/overlay/bottom.dart index 14dd28492..e75f84c8b 100644 --- a/lib/widgets/viewer/overlay/bottom.dart +++ b/lib/widgets/viewer/overlay/bottom.dart @@ -46,8 +46,7 @@ class ViewerBottomOverlay extends StatefulWidget { State createState() => _ViewerBottomOverlayState(); static double actionSafeHeight(BuildContext context) { - final mq = context.read(); - final mqPaddingBottom = max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom); + final mqPaddingBottom = context.select((mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom)); final buttonHeight = ViewerButtons.preferredHeight(context); final thumbnailHeight = (settings.showOverlayThumbnailPreview ? ViewerThumbnailPreview.preferredHeight : 0); return mqPaddingBottom + buttonHeight + thumbnailHeight;