From 085a7648f3fe0afd720ff1f542b1ea80955b9523 Mon Sep 17 00:00:00 2001 From: atseirjo Date: Mon, 25 Aug 2025 14:22:10 +0200 Subject: [PATCH] add ListView Summs Liter Price per Year --- README.md | 2 +- lib/data/models/tank_model.dart | 5 +- lib/pages/tanklist/tanklist_controller.dart | 28 +++++- lib/pages/tanklist/tanklist_view.dart | 90 +++++++++++++------ .../tanklist/widgets/my_list_tile_item.dart | 5 +- lib/utils/app_initializer.dart | 1 + 6 files changed, 92 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 6c2f186..c957792 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ This guide will help you quickly set up, customize, and build your Flutter app. Clone this repository to your local machine using Git or directly from `Android Studio`: ```bash -git clone https://github.com/appwrite/starter-for-flutter +git clone https://gitea.joshihomeserver.ipv64.net/josiadmin/MyNewAppWriteTankApp.git ``` Alternatively, open the repository URL in `Android Studio` to clone it directly. diff --git a/lib/data/models/tank_model.dart b/lib/data/models/tank_model.dart index 73a3a52..a33b8b0 100644 --- a/lib/data/models/tank_model.dart +++ b/lib/data/models/tank_model.dart @@ -10,6 +10,7 @@ class AppWriteTankModel { String? imageFileName; String? imageFileUrl; int? mnIndexCount; + String? szSummePreis; AppWriteTankModel({ required this.documentId, @@ -22,7 +23,9 @@ class AppWriteTankModel { this.imageFileId, this.imageFileName, this.imageFileUrl, - }); + }):szSummePreis = (double.tryParse(liters) != null && double.tryParse(pricePerLiter) != null) + ? (double.parse(liters) * double.parse(pricePerLiter)).toStringAsFixed(2) + : null; factory AppWriteTankModel.fromMap(Map map) { return AppWriteTankModel( diff --git a/lib/pages/tanklist/tanklist_controller.dart b/lib/pages/tanklist/tanklist_controller.dart index 7824dcc..4ba86ae 100644 --- a/lib/pages/tanklist/tanklist_controller.dart +++ b/lib/pages/tanklist/tanklist_controller.dart @@ -12,10 +12,14 @@ import '../login/login_view.dart'; class TanklistController extends GetxController { final _dataBox = GetStorage('MyUserStorage'); final isloadingList = false.obs; - final tankList = [].obs; + final rxTankListAlles = [].obs; + final rxTankListActualYear = [].obs; final szRxUserId = 'NoUser'.obs; //AppWrite API-REST get Data final AppwriteRepository _authRepository = AppwriteRepository(); + final szRxYear = DateTime.now().year.obs.toString().obs; + final szRxSummeYearLiter = '0.0'.obs; + final szRxSummePrice = '0.0'.obs; @override void onInit() { @@ -45,16 +49,32 @@ class TanklistController extends GetxController { message = 'Leere Liste keine Daten vorhanden'; return; } - tankList.clear(); + rxTankListAlles.clear(); var data = tankListData.toMap(); List d = data['documents'].toList(); - tankList.value = + rxTankListAlles.value = d.map((e) => AppWriteTankModel.fromMap(e['data'])).toList(); - tankList.sort((a, b) { + rxTankListAlles.sort((a, b) { final DateTime dateA = DateTime.parse(a.date); final DateTime dateB = DateTime.parse(b.date); return dateB.compareTo(dateA); }); + //Tank List per Actual year********** + rxTankListActualYear.clear(); + rxTankListActualYear.value = rxTankListAlles + .where((tank) => tank.date.startsWith(szRxYear.value)) + .toList(); + //Summe Liter aktuelles Jahr********* + szRxSummeYearLiter( + rxTankListActualYear.fold(0.0, (previousValue, element) { + return previousValue + (double.tryParse(element.liters) ?? 0.0); + }).toStringAsFixed(2)); + //Summe Preis aktuelles Jahr********* + szRxSummePrice( + rxTankListActualYear.fold(0.0, (previousValue, element) { + return previousValue + (double.tryParse(element.szSummePreis!) ?? 0.0); + }).toStringAsFixed(2)); + message = 'Liste wurde erfolgreich geladen'; }).catchError((error) { isErrorByLoading = true; diff --git a/lib/pages/tanklist/tanklist_view.dart b/lib/pages/tanklist/tanklist_view.dart index e0fa0af..99b2130 100644 --- a/lib/pages/tanklist/tanklist_view.dart +++ b/lib/pages/tanklist/tanklist_view.dart @@ -15,6 +15,7 @@ class TanklistPage extends GetView { child: SafeArea( child: Scaffold( appBar: AppBar( + shadowColor: Colors.grey, title: Text('Tankstops'), centerTitle: true, //backgroundColor: Colors.grey.shade600, @@ -51,38 +52,69 @@ class TanklistPage extends GetView { body: Obx(() => tankListCtrl.isloadingList.value == false ? Padding( padding: EdgeInsetsGeometry.only(left: 25, right: 25), - child: ListView.builder( - padding: EdgeInsets.only(top: 8, bottom: 8), - physics: const BouncingScrollPhysics(), - itemBuilder: ((BuildContext context, int index) { - var item = tankListCtrl.tankList[index]; - return Column( - children: [ - Container( - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.blue.withValues( - alpha: 0.35, - ), // Die Farbe des Schattens - spreadRadius: - 1, // Wie weit sich der Schatten ausbreitet - blurRadius: - 1, // Wie stark der Schatten verschwommen ist - offset: const Offset( - 0, - 3, - ), // Der Versatz des Schattens (x, y) + child: Column( + children: [ + SizedBox( + child: Column( + children: [ + Text(tankListCtrl.szRxYear.value, style: TextStyle(fontSize: 25, color: Colors.orange)), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + children: [ + Text('Jahresverbrauch', style: TextStyle(fontSize: 14)), + Text( tankListCtrl.szRxSummeYearLiter.value, style: TextStyle(fontSize: 20, color: Colors.orange)), + ], + ), + Column( + children: [ + Text('Jahressumme', style: TextStyle(fontSize: 14)), + Text(tankListCtrl.szRxSummePrice.value, style: TextStyle(fontSize: 20, color: Colors.orange)), + ], ), ], ), - child: MyListTileItem(listItem: item), - ), - SizedBox(height: 15), - ], - ); - }), - itemCount: tankListCtrl.tankList.length, + ], + ), + ), + Divider(color: Colors.grey.shade200, height: 0.0,), + Expanded( + child: ListView.builder( + padding: EdgeInsets.only(top: 8, bottom: 8), + physics: const BouncingScrollPhysics(), + itemBuilder: ((BuildContext context, int index) { + var item = tankListCtrl.rxTankListActualYear[index]; + return Column( + children: [ + Container( + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.blue.withValues( + alpha: 0.35, + ), // Die Farbe des Schattens + spreadRadius: + 1, // Wie weit sich der Schatten ausbreitet + blurRadius: + 1, // Wie stark der Schatten verschwommen ist + offset: const Offset( + 0, + 3, + ), // Der Versatz des Schattens (x, y) + ), + ], + ), + child: MyListTileItem(listItem: item), + ), + SizedBox(height: 15), + ], + ); + }), + itemCount: tankListCtrl.rxTankListActualYear.length, + ), + ), + ], ), ) : Center( diff --git a/lib/pages/tanklist/widgets/my_list_tile_item.dart b/lib/pages/tanklist/widgets/my_list_tile_item.dart index a707a59..a9b0e62 100644 --- a/lib/pages/tanklist/widgets/my_list_tile_item.dart +++ b/lib/pages/tanklist/widgets/my_list_tile_item.dart @@ -15,9 +15,6 @@ class MyListTileItem extends StatelessWidget { Widget _myListItem(BuildContext context) { var textColor = Colors.orange.shade400; - var summePrice = - (double.parse(listItem.liters) * double.parse(listItem.pricePerLiter)) - .toStringAsFixed(2); return Padding( padding: const EdgeInsets.all(10.0), child: Column( @@ -75,7 +72,7 @@ class MyListTileItem extends StatelessWidget { children: [ Icon(Icons.price_change), SizedBox(width: 10), - Text('$summePrice €', style: TextStyle(color: textColor, fontSize: 25)), + Text('${listItem.szSummePreis} €', style: TextStyle(color: textColor, fontSize: 25)), ], ), Divider(thickness: 1, color: Colors.black), diff --git a/lib/utils/app_initializer.dart b/lib/utils/app_initializer.dart index f18b249..65f0e75 100644 --- a/lib/utils/app_initializer.dart +++ b/lib/utils/app_initializer.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:window_manager/window_manager.dart'; + import './extensions/http_overrides.dart'; /// A utility class for initializing the Flutter application.