76 lines
2.1 KiB
Dart
76 lines
2.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
class EmptyState extends StatelessWidget {
|
|
final IconData icon;
|
|
final String title;
|
|
final String? message;
|
|
final Widget? action;
|
|
final Color? foregroundColor;
|
|
|
|
|
|
final bool compact;
|
|
|
|
const EmptyState({
|
|
super.key,
|
|
this.icon = Icons.inbox_outlined,
|
|
required this.title,
|
|
this.message,
|
|
this.action,
|
|
this.foregroundColor,
|
|
this.compact = false,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
final iconSize = compact ? 28.0 : 56.0;
|
|
final pad = compact ? 16.0 : 32.0;
|
|
final iconGap = compact ? 8.0 : 18.0;
|
|
final messageGap = compact ? 8.0 : 10.0;
|
|
final actionGap = compact ? 8.0 : 20.0;
|
|
final iconAlpha = compact ? 0.5 : 0.4;
|
|
final titleStyle = compact
|
|
? theme.textTheme.bodyMedium
|
|
: theme.textTheme.titleMedium;
|
|
final messageText = message == null
|
|
? null
|
|
: Text(
|
|
message!,
|
|
textAlign: TextAlign.center,
|
|
style: theme.textTheme.bodyMedium?.copyWith(
|
|
color:
|
|
foregroundColor?.withValues(alpha: 0.72) ??
|
|
theme.colorScheme.onSurfaceVariant,
|
|
),
|
|
);
|
|
return Center(
|
|
child: Padding(
|
|
padding: EdgeInsets.all(pad),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(
|
|
icon,
|
|
size: iconSize,
|
|
color: (foregroundColor ?? theme.colorScheme.onSurfaceVariant)
|
|
.withValues(alpha: iconAlpha),
|
|
),
|
|
SizedBox(height: iconGap),
|
|
Text(title, style: titleStyle?.copyWith(color: foregroundColor)),
|
|
if (messageText != null) ...[
|
|
SizedBox(height: messageGap),
|
|
compact
|
|
? messageText
|
|
: ConstrainedBox(
|
|
constraints: const BoxConstraints(maxWidth: 280),
|
|
child: messageText,
|
|
),
|
|
],
|
|
if (action != null) ...[SizedBox(height: actionGap), action!],
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|