130 lines
5.1 KiB
Dart
130 lines
5.1 KiB
Dart
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter_application_1/enums.dart';
|
|
import 'package:flutter_application_1/translations.dart';
|
|
import 'package:flutter_application_1/widgets/expandable_widget.dart';
|
|
import 'package:flutter_application_1/widgets/chart_widget.dart';
|
|
|
|
// Erstellt das Widget für das Ergebnis der Berechnungen
|
|
Widget buildResultWidget(String compoundInterest, String investedMoney, String time, String monthlySavingsRate, String interestRate, PayoutInterval payoutInterval, List<double> investedMoneyList, List<double> compoundInterestList) {
|
|
// Liste von Meilensteinen mit Werten, Bildern und Texten.
|
|
List<Map<String, dynamic>> milestoneList = [
|
|
{'value': 1329.0, 'emoji': '📱', 'text': 'iPhone 15 Pro Max\nPreis: 1329€'},
|
|
{'value': 3071.0, 'emoji': '🚲', 'text': 'Flyer Gotour6 3.40\nPreis: 3071€'},
|
|
{'value': 248157.0, 'emoji': '🏎️', 'text': 'Porsche 992 GT3 RS\nPreis: 248157€'},
|
|
{'value': 450000.0, 'emoji': '🏡', 'text': '150qm Einfamilienhaus\nPreis: ca. 450000€'},
|
|
];
|
|
return Column(
|
|
children: <Widget>[
|
|
_buildResultRow('Endkapital:', '$compoundInterest€'),
|
|
_buildResultRow('Einzahlungen:', '$investedMoney€'),
|
|
_buildResultRow('Erhaltene Zinsen:', '${double.parse(compoundInterest) - double.parse(investedMoney)}€'),
|
|
const SizedBox(height: 20),
|
|
Text(
|
|
'Wenn du über einen Zeitraum von $time Jahren ${translateInterval(payoutInterval)} $monthlySavingsRate€ mit einem Zinssatz von $interestRate% investierst, erreichst du am Ende ein Endkapital von $compoundInterest€. Dieses setzt sich aus Einzahlungen von $investedMoney€ und Zinsen bzw. Kapitalerträgen in Höhe von ${double.parse(compoundInterest) - double.parse(investedMoney)}€ zusammen.'
|
|
),
|
|
const SizedBox(height: 20),
|
|
ExpandableBox(
|
|
headerText: 'Grafik',
|
|
expandedContent: StackedColumnChart(
|
|
lowerValues: investedMoneyList,
|
|
upperValues: compoundInterestList,
|
|
),
|
|
),
|
|
const SizedBox(height: 5),
|
|
ExpandableBox(
|
|
headerText: 'Meilensteine',
|
|
expandedContent: buildMilestoneTimeline(milestoneList, double.parse(compoundInterest) - double.parse(investedMoney)),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildResultRow(String label, String value) {
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 20),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Flexible(
|
|
child: Text(
|
|
label,
|
|
textAlign: TextAlign.start,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(width: 20),
|
|
Flexible(
|
|
child: Text(
|
|
value,
|
|
textAlign: TextAlign.end,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
|
|
|
|
// Erstellt die Meilenstein-Timeline.
|
|
Widget buildMilestoneTimeline(List<Map<String, dynamic>> milestones, double totalInterest) {
|
|
return SizedBox(
|
|
child: Center(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: List.generate(milestones.length, (index) {
|
|
// Werte aus dem Meilenstein-Objekt extrahieren
|
|
double milestoneValue = milestones[index]['value'];
|
|
String milestoneEmoji = milestones[index]['emoji'];
|
|
String milestoneText = milestones[index]['text'];
|
|
bool milestoneReached = totalInterest >= milestoneValue;
|
|
return Column(
|
|
children: [
|
|
if (index > 0) // Zeigt eine vertikale Linie an zwischen den Meilensteinen
|
|
Container(
|
|
height: 50,
|
|
width: 2,
|
|
color: milestoneReached ? CupertinoColors.systemGreen : CupertinoColors.black,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 4.0),
|
|
child: Column(
|
|
children: [
|
|
Text(
|
|
milestoneEmoji,
|
|
style: const TextStyle(fontSize: 25),
|
|
),
|
|
const SizedBox(height: 5),
|
|
Text(
|
|
milestoneText,
|
|
textAlign: TextAlign.center,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
// Zeigt ein Häkchen oder einen Kreis je nach Erreichen des Meilensteins an
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 4.0),
|
|
child: Icon(
|
|
milestoneReached ? CupertinoIcons.check_mark_circled_solid : CupertinoIcons.circle_fill,
|
|
size: 20,
|
|
color: milestoneReached ? CupertinoColors.systemGreen : CupertinoColors.black,
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|