fifty_achievement_engine 0.2.2
fifty_achievement_engine: ^0.2.2 copied to clipboard
Achievement system for Flutter games with condition-based unlocks, progress tracking, and FDL-compliant UI.
import 'package:fifty_tokens/fifty_tokens.dart';
import 'package:flutter/material.dart';
import 'examples/basic_achievements.dart';
import 'examples/custom_builders.dart';
import 'examples/rpg_achievements.dart';
import 'examples/fitness_achievements.dart';
void main() {
runApp(const AchievementEngineExampleApp());
}
/// Example app demonstrating fifty_achievement_engine features.
class AchievementEngineExampleApp extends StatefulWidget {
const AchievementEngineExampleApp({super.key});
@override
State<AchievementEngineExampleApp> createState() =>
_AchievementEngineExampleAppState();
}
class _AchievementEngineExampleAppState
extends State<AchievementEngineExampleApp> {
bool _isBalticBlue = false;
void _togglePreset() {
setState(() {
_isBalticBlue = !_isBalticBlue;
if (_isBalticBlue) {
FiftyTokens.load(FiftyPreset.balticBlue);
} else {
FiftyTokens.load(FiftyPreset.fdlV2);
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Achievement Engine Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: FiftyColors.primary,
surface: FiftyColors.backgroundDark,
onSurface: FiftyColors.background,
outline: FiftyColors.borderDark,
surfaceContainerHighest: FiftyColors.surfaceDark,
),
scaffoldBackgroundColor: FiftyColors.backgroundDark,
appBarTheme: AppBarTheme(
backgroundColor: FiftyColors.surfaceDark,
foregroundColor: FiftyColors.background,
elevation: 0,
),
),
home: ExampleLauncher(
isBalticBlue: _isBalticBlue,
onTogglePreset: _togglePreset,
),
);
}
}
/// Launcher screen for selecting different examples.
class ExampleLauncher extends StatelessWidget {
const ExampleLauncher({
super.key,
required this.isBalticBlue,
required this.onTogglePreset,
});
final bool isBalticBlue;
final VoidCallback onTogglePreset;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(isBalticBlue
? 'Achievements — BALTIC BLUE'
: 'Achievement Engine Examples'),
),
floatingActionButton: FloatingActionButton.extended(
onPressed: onTogglePreset,
icon: Icon(isBalticBlue ? Icons.restore : Icons.palette),
label: Text(isBalticBlue ? 'RESET FDL v2' : 'BALTIC BLUE'),
),
body: ListView(
padding: EdgeInsets.all(FiftySpacing.md),
children: [
_buildExampleTile(
context,
title: 'Basic Achievements',
subtitle: 'Simple event and count-based achievements',
icon: Icons.star_outline,
builder: (context) => const BasicAchievementsExample(),
),
SizedBox(height: FiftySpacing.md),
_buildExampleTile(
context,
title: 'RPG Achievements',
subtitle: 'Combat, leveling, and quest achievements',
icon: Icons.sports_esports,
builder: (context) => const RpgAchievementsExample(),
),
SizedBox(height: FiftySpacing.md),
_buildExampleTile(
context,
title: 'Fitness Achievements',
subtitle: 'Workout tracking with time and stat conditions',
icon: Icons.fitness_center,
builder: (context) => const FitnessAchievementsExample(),
),
SizedBox(height: FiftySpacing.md),
_buildExampleTile(
context,
title: 'Custom Builders',
subtitle: 'Custom itemBuilder, contentBuilder, and barBuilder',
icon: Icons.build,
builder: (context) => const CustomBuildersExample(),
),
],
),
);
}
Widget _buildExampleTile(
BuildContext context, {
required String title,
required String subtitle,
required IconData icon,
required WidgetBuilder builder,
}) {
final colorScheme = Theme.of(context).colorScheme;
return Card(
color: colorScheme.surfaceContainerHighest,
shape: RoundedRectangleBorder(
borderRadius: FiftyRadii.lgRadius,
side: BorderSide(color: colorScheme.outline),
),
child: ListTile(
contentPadding: EdgeInsets.all(FiftySpacing.md),
leading: Container(
width: 48,
height: 48,
decoration: BoxDecoration(
color: colorScheme.primary.withValues(alpha: 0.2),
borderRadius: FiftyRadii.mdRadius,
),
child: Icon(
icon,
color: colorScheme.primary,
),
),
title: Text(
title,
style: TextStyle(
fontFamily: FiftyTypography.fontFamily,
fontWeight: FiftyTypography.bold,
color: colorScheme.onSurface,
),
),
subtitle: Text(
subtitle,
style: TextStyle(
fontFamily: FiftyTypography.fontFamily,
color: colorScheme.onSurface.withValues(alpha: 0.7),
),
),
trailing: Icon(
Icons.chevron_right,
color: colorScheme.onSurface.withValues(alpha: 0.5),
),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(builder: builder),
);
},
),
);
}
}