action snack bar layout review

This commit is contained in:
Thibault Deckers 2022-08-12 19:35:15 +02:00
parent 08daddb1ec
commit 6dc2d81027
2 changed files with 21 additions and 14 deletions

View file

@ -39,9 +39,12 @@ mixin FeedbackMixin {
void showFeedbackWithMessenger(BuildContext context, ScaffoldMessengerState messenger, String message, [SnackBarAction? action]) { void showFeedbackWithMessenger(BuildContext context, ScaffoldMessengerState messenger, String message, [SnackBarAction? action]) {
_getSnackBarDuration(action != null).then((duration) { _getSnackBarDuration(action != null).then((duration) {
final start = DateTime.now(); final start = DateTime.now();
final theme = Theme.of(context);
final snackBarTheme = theme.snackBarTheme;
final snackBarContent = _FeedbackMessage( final snackBarContent = _FeedbackMessage(
message: message, message: message,
progressColor: Theme.of(context).colorScheme.secondary, progressColor: theme.colorScheme.secondary,
start: start, start: start,
stop: action != null ? start.add(duration) : null, stop: action != null ? start.add(duration) : null,
); );
@ -64,7 +67,7 @@ mixin FeedbackMixin {
action: action != null action: action != null
? TextButton( ? TextButton(
style: ButtonStyle( style: ButtonStyle(
foregroundColor: MaterialStateProperty.all(Theme.of(context).snackBarTheme.actionTextColor), foregroundColor: MaterialStateProperty.all(snackBarTheme.actionTextColor),
), ),
onPressed: () { onPressed: () {
notificationOverlayEntry?.dismiss(); notificationOverlayEntry?.dismiss();
@ -87,6 +90,7 @@ mixin FeedbackMixin {
} else { } else {
messenger.showSnackBar(SnackBar( messenger.showSnackBar(SnackBar(
content: snackBarContent, content: snackBarContent,
padding: action != null ? EdgeInsetsDirectional.only(start: snackBarHorizontalPadding(snackBarTheme)) : null,
action: action, action: action,
duration: duration, duration: duration,
dismissDirection: DismissDirection.horizontal, dismissDirection: DismissDirection.horizontal,
@ -95,6 +99,12 @@ mixin FeedbackMixin {
}); });
} }
static double snackBarHorizontalPadding(SnackBarThemeData snackBarTheme) {
final isFloatingSnackBar = (snackBarTheme.behavior ?? SnackBarBehavior.fixed) == SnackBarBehavior.floating;
final horizontalPadding = isFloatingSnackBar ? 16.0 : 24.0;
return horizontalPadding;
}
Future<Duration> _getSnackBarDuration(bool hasAction) async { Future<Duration> _getSnackBarDuration(bool hasAction) async {
final appDefaultDuration = hasAction ? Durations.opToastActionDisplay : Durations.opToastTextDisplay; final appDefaultDuration = hasAction ? Durations.opToastActionDisplay : Durations.opToastTextDisplay;
switch (settings.timeToTakeAction) { switch (settings.timeToTakeAction) {

View file

@ -1,3 +1,4 @@
import 'package:aves/widgets/common/action_mixins/feedback.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// adapted from Flutter `SnackBar` in `/material/snack_bar.dart` // adapted from Flutter `SnackBar` in `/material/snack_bar.dart`
@ -49,9 +50,8 @@ class OverlaySnackBar extends StatelessWidget {
final contentTextStyle = snackBarTheme.contentTextStyle ?? ThemeData(brightness: brightness).textTheme.subtitle1; final contentTextStyle = snackBarTheme.contentTextStyle ?? ThemeData(brightness: brightness).textTheme.subtitle1;
const horizontalPadding = 16.0; final horizontalPadding = FeedbackMixin.snackBarHorizontalPadding(snackBarTheme);
final padding = EdgeInsetsDirectional.only(start: horizontalPadding, end: action != null ? 0 : horizontalPadding); final padding = EdgeInsetsDirectional.only(start: horizontalPadding, end: action != null ? 0 : horizontalPadding);
const actionHorizontalMargin = horizontalPadding / 2;
const singleLineVerticalPadding = 14.0; const singleLineVerticalPadding = 14.0;
Widget snackBar = Padding( Widget snackBar = Padding(
@ -60,7 +60,7 @@ class OverlaySnackBar extends StatelessWidget {
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
child: Container( child: Container(
padding: const EdgeInsets.symmetric(vertical: singleLineVerticalPadding), padding: action != null ? null : const EdgeInsets.symmetric(vertical: singleLineVerticalPadding),
child: DefaultTextStyle( child: DefaultTextStyle(
style: contentTextStyle!, style: contentTextStyle!,
child: content, child: content,
@ -68,18 +68,15 @@ class OverlaySnackBar extends StatelessWidget {
), ),
), ),
if (action != null) if (action != null)
Padding( TextButtonTheme(
padding: const EdgeInsets.symmetric(horizontal: actionHorizontalMargin),
child: TextButtonTheme(
data: TextButtonThemeData( data: TextButtonThemeData(
style: TextButton.styleFrom( style: TextButton.styleFrom(
foregroundColor: buttonColor, foregroundColor: buttonColor,
padding: const EdgeInsets.symmetric(horizontal: horizontalPadding), padding: EdgeInsets.symmetric(horizontal: horizontalPadding),
), ),
), ),
child: action!, child: action!,
), ),
),
], ],
), ),
); );