import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; /* todo: - Einkauf und Settings - Warenkorb - Aufladungen? - farbliche Hervorhebungen - semanticLabels, Screenreader - monatliche Aufladung: ausstehende Beträge */ enum Art { monatlBeitrag, aufladung, einkauf, korrektur } final now = DateTime.now(); class Transaction { int betrag; Art art; DateTime datum; String? beschreibung; Transaction(this.art, this.betrag, this.datum, [this.beschreibung]); } //sample data class Finance extends StatelessWidget { final List transactions = [ Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.aufladung, 2042, now), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), 'Korrektur des Warenkorbs'), Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.aufladung, 2042, now), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), 'Korrektur des Warenkorbs'), Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.aufladung, 2042, now), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), 'Korrektur des Warenkorbs'), Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.aufladung, 2042, now), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), 'Korrektur des Warenkorbs'), Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.aufladung, 2042, now), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), 'Korrektur des Warenkorbs') ]; Finance({super.key}); @override Widget build(BuildContext context) { initializeDateFormatting('de_DE'); return Scaffold( appBar: AppBar( toolbarHeight: 75, title: const Card( child: ListTile( leading: Icon( Icons.euro, ), title: Text( 'Aktuelles Guthaben:', ), subtitle: Text( '-00,34€', )), ), ), body: ListView.builder( itemCount: null, itemBuilder: (context, index) { if (index < transactions.length) { return Card( child: ListTile( leading: getIcon(transactions[index].art), title: Text(gettitle(transactions[index].art)), subtitle: getSubtitle(index), trailing: transactions[index].art == Art.einkauf ? PopupMenuButton( onSelected: (value) {}, itemBuilder: (BuildContext context) => >[ const PopupMenuItem( value: 'Option', child: ListTile( leading: Icon(Icons.manage_history), title: Text('Warenkorb bearbeiten')), ), const PopupMenuItem( value: 'Option', child: ListTile( leading: Icon(Icons.remove_shopping_cart), title: Text('Einkauf stornieren')), ), ], ) : null, onTap: () { if (transactions[index].art == Art.einkauf) { showBottomSheet( context: context, builder: (BuildContext context) { return const SizedBox.expand(); }); } })); } else { return null; } })); } String gettitle(Art art) { switch (art) { case Art.aufladung: return 'Aufladung'; case Art.einkauf: return 'Einkauf'; case Art.korrektur: return 'Korrektur'; case Art.monatlBeitrag: return 'monatlicher Beitrag'; } } Text getSubtitle(int index) { String text = '${transactions[index].betrag / 100}'; text += '€ '; text += DateFormat("EEEE, dd. MMMM yyyy HH:mm", 'de_DE') .format(transactions[index].datum); if (transactions[index].beschreibung != null) { (text += '\n${transactions[index].beschreibung}'); } return Text(text); } Icon getIcon(Art art) { switch (art) { case Art.aufladung: return const Icon(Icons.savings); case Art.einkauf: return const Icon(Icons.shopping_basket); case Art.korrektur: return const Icon(Icons.priority_high); case Art.monatlBeitrag: return const Icon(Icons.payment); } } }