Compare commits

..

No commits in common. "3ab6cd56903d7ad6249d242848dc0d2fbe3a5bce" and "5ad2ae086707950087ea07643a34db4215805686" have entirely different histories.

3 changed files with 105 additions and 143 deletions

View file

@ -1,7 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
//this was used in a earlier version of the app and will possibly be removed in future versions.
class Expand extends StatefulWidget { class Expand extends StatefulWidget {
final Widget child; final Widget child;
final bool expand; final bool expand;

View file

@ -1,15 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/date_symbol_data_local.dart';
import 'expand.dart';
/* /*
todo: todo:
- Design, Farbschema, Darkmode
- Einkauf und Settings - Einkauf und Settings
- Warenkorb - Details zum Warenkorb und Beschreibung (https://stackoverflow.com/questions/49029841/how-to-animate-collapse-elements-in-flutter)
- Aufladungen?
- farbliche Hervorhebungen - farbliche Hervorhebungen
- semanticLabels, Screenreader
- monatliche Aufladung: ausstehende Beträge
*/ */
enum Art { monatlBeitrag, aufladung, einkauf, korrektur } enum Art { monatlBeitrag, aufladung, einkauf, korrektur }
@ -20,142 +19,123 @@ class Transaction {
int betrag; int betrag;
Art art; Art art;
DateTime datum; DateTime datum;
String? beschreibung; String beschreibung;
Transaction(this.art, this.betrag, this.datum, [this.beschreibung]); bool elevated = true;
Transaction(this.art, this.betrag, this.datum, this.beschreibung);
} }
//sample data class Finance extends StatefulWidget {
class Finance extends StatelessWidget { const Finance({super.key});
@override
State<Finance> createState() => _Finance();
}
class _Finance extends State<Finance> {
final List<Transaction> transactions = [ final List<Transaction> transactions = [
Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.monatlBeitrag, 0, now, ''),
Transaction(Art.aufladung, 2042, now), Transaction(Art.aufladung, 2042, now, ''),
Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2)), ''),
Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)),
'Korrektur des Warenkorbs'), 'Korrektur des Warenkorbs'),
Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.monatlBeitrag, 0, now, ''),
Transaction(Art.aufladung, 2042, now), Transaction(Art.aufladung, 2042, now, ''),
Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2)), ''),
Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)),
'Korrektur des Warenkorbs'), 'Korrektur des Warenkorbs'),
Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.monatlBeitrag, 0, now, ''),
Transaction(Art.aufladung, 2042, now), Transaction(Art.aufladung, 2042, now, ''),
Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2)), ''),
Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)),
'Korrektur des Warenkorbs'), 'Korrektur des Warenkorbs'),
Transaction(Art.monatlBeitrag, 0, now), Transaction(Art.monatlBeitrag, 0, now, ''),
Transaction(Art.aufladung, 2042, now), Transaction(Art.aufladung, 2042, now, ''),
Transaction(Art.einkauf, -2442, now.subtract(const Duration(days: 2))), 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)), Transaction(Art.korrektur, 2332, now.subtract(const Duration(hours: 5)),
'Korrektur des Warenkorbs') 'Korrektur des Warenkorbs')
]; ];
Finance({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
initializeDateFormatting('de_DE'); initializeDateFormatting('de_DE');
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
toolbarHeight: 75, toolbarHeight: 75,
title: const Card( title: const Card(
child: ListTile( child: Padding(
leading: Icon( padding: EdgeInsets.all(8.0),
Icons.euro, child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Icon(
Icons.euro,
//color: Colors.black,
//semanticLabel: 'Text for screenreader',
),
Column(
children: [
Text(
'Aktuelles Guthaben:',
style: TextStyle(fontWeight: FontWeight.bold),
),
Text(
'-00,34€',
style: TextStyle(fontWeight: FontWeight.bold),
)
],
)
],
), ),
title: Text( ),
'Aktuelles Guthaben:', )),
),
subtitle: Text(
'-00,34€',
)),
),
),
body: ListView.builder( body: ListView.builder(
itemCount: null, itemCount: null,
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index < transactions.length) { if (index < transactions.length) {
return Card( return Card(
child: ListTile( clipBehavior: Clip.hardEdge,
leading: getIcon(transactions[index].art), child: InkWell(
title: Text(gettitle(transactions[index].art)), splashColor: Colors.blue.withAlpha(30),
subtitle: getSubtitle(index), onTap: () {
trailing: transactions[index].art == Art.einkauf transactions[index].elevated =
? PopupMenuButton( !transactions[index].elevated;
onSelected: (value) {}, setState(() {});
itemBuilder: (BuildContext context) => debugPrint('Card tapped');
<PopupMenuEntry<String>>[ },
const PopupMenuItem<String>( child: Padding(
value: 'Option', padding: const EdgeInsets.all(8.0),
child: ListTile( child: Row(
leading: Icon(Icons.manage_history), mainAxisAlignment: MainAxisAlignment.spaceEvenly,
title: Text('Warenkorb bearbeiten')), children: [
), Icon(transactions[index].art == Art.korrektur
const PopupMenuItem<String>( ? Icons.error
value: 'Option', : Icons.money),
child: ListTile( Column(
leading: children: [
Icon(Icons.remove_shopping_cart), Row(
title: Text('Einkauf stornieren')), children: [
), Text(DateFormat(
], "EEEE, dd. MMMM yyyy HH:mm", 'de_DE')
) .format(now)),
: null, Text(
onTap: () { '${transactions[index].art}: ${transactions[index].betrag / 100}'),
if (transactions[index].art == Art.einkauf) { ],
showBottomSheet( ),
context: context, Expand(
builder: (BuildContext context) { expand: transactions[index].elevated,
return const SizedBox.expand(); child: Text(transactions[index].beschreibung))
}); ],
} ),
})); ],
} else { ),
return null; ),
} ),
})); );
} } 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);
}
} }
} }

View file

@ -14,19 +14,10 @@ class MyApp extends StatelessWidget {
title: 'SoNaKo Demo App', title: 'SoNaKo Demo App',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
//darkgreen:5f7c61, mediumgreen: 66906a, lightgreen: 9cbe96, yellow: f5de64
useMaterial3: true, useMaterial3: true,
brightness: Brightness.light,
colorScheme: ColorScheme.fromSeed( colorScheme: ColorScheme.fromSeed(
brightness: Brightness.light, seedColor: Colors.green)), //9bbee6 //79,128,104
seedColor: const Color(0xff5f7c61))), darkTheme: ThemeData.dark(),
darkTheme: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorScheme: ColorScheme.fromSeed(
brightness: Brightness.dark,
seedColor: const Color(0xff5f7c61),
)),
themeMode: ThemeMode.system, themeMode: ThemeMode.system,
home: const MyHomePage(), home: const MyHomePage(),
); );
@ -81,16 +72,9 @@ class _MyHomePageState extends State<MyHomePage> {
alignment: Alignment.center, alignment: Alignment.center,
child: Text('Page $test'), child: Text('Page $test'),
), ),
Finance(), const Finance(),
ListView(children: const <Widget>[ const Text(
ListTile( 'Hier könnten Einstellungen zu Darkmode mit shared_preferences und riverpod sein')
leading: Icon(Icons.dark_mode),
title: Text(
'Hier könnten Einstellungen zu Darkmode mit shared_preferences und riverpod sein',
maxLines: 2,
),
)
])
][currentPageIndex], ][currentPageIndex],
); );
} }