action snack bar layout review
This commit is contained in:
parent
08daddb1ec
commit
6dc2d81027
2 changed files with 21 additions and 14 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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!,
|
||||||
),
|
),
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue