51 lines
1.4 KiB
Dart
51 lines
1.4 KiB
Dart
import 'package:flutter/material.dart';
|
|||
|
|
|
||
|
|
import '../theme/theme_x.dart';
|
||
|
|
|
||
|
|
/// Centered "nothing here yet" placeholder — no services discovered, no
|
||
|
|
/// connections saved, no update history. An optional action gives the user
|
||
|
|
/// the next step rather than a dead end.
|
||
|
|
class EmptyState extends StatelessWidget {
|
||
|
|
const EmptyState({
|
||
|
|
super.key,
|
||
|
|
required this.icon,
|
||
|
|
required this.title,
|
||
|
|
this.message,
|
||
|
|
this.actionLabel,
|
||
|
|
this.onAction,
|
||
|
|
});
|
||
|
|
|
||
|
|
final IconData icon;
|
||
|
|
final String title;
|
||
|
|
final String? message;
|
||
|
|
final String? actionLabel;
|
||
|
|
final VoidCallback? onAction;
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return Padding(
|
||
|
|
padding: const EdgeInsets.symmetric(vertical: 40, horizontal: 24),
|
||
|
|
child: Column(
|
||
|
|
mainAxisSize: MainAxisSize.min,
|
||
|
|
children: [
|
||
|
|
Icon(icon, size: 30, color: context.colors.outline),
|
||
|
|
const SizedBox(height: 12),
|
||
|
|
Text(title, style: context.text.titleMedium, textAlign: TextAlign.center),
|
||
|
|
if (message != null) ...[
|
||
|
|
const SizedBox(height: 4),
|
||
|
|
Text(
|
||
|
|
message!,
|
||
|
|
style: context.text.bodySmall,
|
||
|
|
textAlign: TextAlign.center,
|
||
|
|
),
|
||
|
|
],
|
||
|
|
if (actionLabel != null && onAction != null) ...[
|
||
|
|
const SizedBox(height: 16),
|
||
|
|
OutlinedButton(onPressed: onAction, child: Text(actionLabel!)),
|
||
|
|
],
|
||
|
|
],
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|