feat:参照研听的基础工程
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../theme/app_text.dart';
|
||||
import 'package:shadcn_ui/shadcn_ui.dart';
|
||||
|
||||
enum AppStateButtonStyle { filled, outline }
|
||||
|
||||
class AppStateCard extends StatelessWidget {
|
||||
const AppStateCard({
|
||||
super.key,
|
||||
required this.icon,
|
||||
required this.title,
|
||||
required this.subtitle,
|
||||
this.buttonLabel,
|
||||
this.onButtonPressed,
|
||||
this.buttonStyle = AppStateButtonStyle.outline,
|
||||
});
|
||||
|
||||
final IconData icon;
|
||||
final String title;
|
||||
final String subtitle;
|
||||
final String? buttonLabel;
|
||||
final VoidCallback? onButtonPressed;
|
||||
final AppStateButtonStyle buttonStyle;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final cs = ShadTheme.of(context).colorScheme;
|
||||
final hasAction = buttonLabel != null && onButtonPressed != null;
|
||||
|
||||
return ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 320),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 104,
|
||||
height: 104,
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
color: cs.secondary,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
child: Icon(icon, size: 46, color: cs.mutedForeground),
|
||||
),
|
||||
const SizedBox(height: 22),
|
||||
Text(
|
||||
title,
|
||||
textAlign: TextAlign.center,
|
||||
style: AppText.cardTitle.copyWith(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: cs.foreground,
|
||||
height: 1.2,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
Text(
|
||||
subtitle,
|
||||
textAlign: TextAlign.center,
|
||||
style: AppText.body.copyWith(
|
||||
fontSize: 15,
|
||||
color: cs.mutedForeground,
|
||||
height: 1.5,
|
||||
),
|
||||
),
|
||||
if (hasAction) ...[
|
||||
const SizedBox(height: 20),
|
||||
SizedBox(
|
||||
height: 42,
|
||||
child: buttonStyle == AppStateButtonStyle.filled
|
||||
? FilledButton(
|
||||
onPressed: onButtonPressed,
|
||||
style: FilledButton.styleFrom(
|
||||
backgroundColor: cs.foreground,
|
||||
foregroundColor: cs.background,
|
||||
elevation: 0,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 18),
|
||||
textStyle: const TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
child: Text(buttonLabel!),
|
||||
)
|
||||
: OutlinedButton(
|
||||
onPressed: onButtonPressed,
|
||||
style: OutlinedButton.styleFrom(
|
||||
foregroundColor: cs.foreground,
|
||||
side: BorderSide(color: cs.border),
|
||||
backgroundColor: cs.background,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 18),
|
||||
textStyle: const TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
child: Text(buttonLabel!),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user