import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import '../../Controller/account_controller.dart'; import '../../Controller/recurring_transaction_controller.dart'; import '../../Controller/transaction_controller.dart'; import '../../Services/navigation_service.dart'; /// Ein Floating Action Button, der beim Klicken ein expandierendes Menü öffnet, /// um neue Transaktionen oder Konten anzulegen. class FloatingCreationButton extends StatefulWidget { /// Erstellt eine neue Instanz dieser Klasse const FloatingCreationButton({super.key}); @override State createState() => _FloatingCreationButtonState(); } class _FloatingCreationButtonState extends State { final AccountController _accountController = AccountController(); final RecurringTransactionController _recurringTransactionController = RecurringTransactionController(); final TransactionController _transactionController = TransactionController(); final _key = GlobalKey(); @override void initState() { super.initState(); _accountController.selected.addListener(() { if (mounted) { setState(() {}); } }); } @override Widget build(final BuildContext context) { final List fabs = []; if (_accountController.selected.value != null) { fabs ..add( _expandableButton( label: 'Neue Transaktion', icon: Icons.swap_horiz, onPressed: _transactionController.newTransactionHandler, ), ) ..add( _expandableButton( label: 'Neue wiederkehrende Transaktion', icon: Icons.repeat, onPressed: _recurringTransactionController.newRecurringTransactionHandler, ), ); } fabs.add( _expandableButton( label: 'Neues Konto', icon: Icons.account_balance_wallet, onPressed: _accountController.newAccountHandler, ), ); return ExpandableFab( key: _key, openButtonBuilder: RotateFloatingActionButtonBuilder( child: const Icon(Icons.add), ), type: ExpandableFabType.up, childrenAnimation: ExpandableFabAnimation.none, distance: 70, children: fabs, ); } Widget _expandableButton({ required final String label, required final IconData icon, required final VoidCallback onPressed, }) { final ThemeData theme = Theme.of( NavigationService.getCurrentBuildContext()!, ); return GestureDetector( onTap: onPressed, child: Row( children: [ ClipRRect( borderRadius: BorderRadius.circular(8), child: BackdropFilter( filter: ImageFilter.blur(sigmaX: 6, sigmaY: 6), child: Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 8, ), decoration: BoxDecoration( color: theme.colorScheme.onPrimary.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(8), ), child: Text(label), ), ), ), const SizedBox(width: 12), FloatingActionButton.small( heroTag: null, onPressed: () { onPressed.call(); final ExpandableFabState? state = _key.currentState; if (state != null && state.isOpen) { state.close(); } }, child: Icon(icon), ), ], ), ); } }