mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-06-14 22:55:12 +10:00
51d6210920
- Introduced `mesh_ui.dart` with reusable widgets including SectionHeader, MeshCard, StatusChip, StatTile, AvatarCircle, SignalBars, RouteChip, PulseDot, BottomSheetHeader, ErrorRetryCard, and ListEntrance. - Implemented `path_map_ui.dart` for path map screens, featuring path distance calculations, playback controls, and a summary list of observed paths. - Created `themed_map_tile_layer.dart` for shared cached map tiles with automatic dark-mode treatment.
69 lines
2.0 KiB
Dart
69 lines
2.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
// showDismissibleSnackBar shows a [SnackBar] with tap to dismiss
|
|
// all other properties are default and optional
|
|
void showDismissibleSnackBar(
|
|
BuildContext context, {
|
|
Key? key,
|
|
required Widget content,
|
|
Color? backgroundColor,
|
|
double? elevation,
|
|
EdgeInsetsGeometry? margin,
|
|
EdgeInsetsGeometry? padding,
|
|
double? width,
|
|
ShapeBorder? shape,
|
|
HitTestBehavior? hitTestBehavior,
|
|
SnackBarBehavior? behavior,
|
|
SnackBarAction? action,
|
|
double? actionOverflowThreshold,
|
|
bool? showCloseIcon,
|
|
Color? closeIconColor,
|
|
Duration? duration,
|
|
bool? persist,
|
|
Animation<double>? animation,
|
|
void Function()? onVisible,
|
|
DismissDirection? dismissDirection,
|
|
Clip? clipBehavior,
|
|
}) {
|
|
// Callers often reach here after an async gap; the context may already be
|
|
// unmounted, or deactivated (popped but not yet disposed) — ancestor
|
|
// lookups on a deactivated element throw. Showing nothing is the right
|
|
// outcome in both cases.
|
|
if (!context.mounted) return;
|
|
var isActive = true;
|
|
assert(() {
|
|
isActive = (context as Element).debugIsActive;
|
|
return true;
|
|
}());
|
|
if (!isActive) return;
|
|
final messenger = ScaffoldMessenger.maybeOf(context);
|
|
if (messenger == null) return;
|
|
messenger.showSnackBar(
|
|
SnackBar(
|
|
key: key,
|
|
content: GestureDetector(
|
|
onTap: () => messenger.hideCurrentSnackBar(),
|
|
child: content,
|
|
),
|
|
backgroundColor: backgroundColor,
|
|
elevation: elevation,
|
|
margin: margin,
|
|
padding: padding,
|
|
width: width,
|
|
shape: shape,
|
|
hitTestBehavior: hitTestBehavior,
|
|
behavior: behavior,
|
|
action: action,
|
|
actionOverflowThreshold: actionOverflowThreshold,
|
|
showCloseIcon: showCloseIcon,
|
|
closeIconColor: closeIconColor,
|
|
duration: duration ?? const Duration(seconds: 4),
|
|
persist: persist,
|
|
animation: animation,
|
|
onVisible: onVisible,
|
|
dismissDirection: dismissDirection ?? DismissDirection.down,
|
|
clipBehavior: clipBehavior ?? Clip.hardEdge,
|
|
),
|
|
);
|
|
}
|