flutter_application_1/lib/main.dart

222 lines
8.6 KiB
Dart
Raw Normal View History

2024-05-06 17:28:10 +02:00
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
2024-05-24 14:04:26 +02:00
import 'package:flutter_application_1/calculator.dart';
2024-05-06 17:28:10 +02:00
import 'package:flutter_application_1/enums.dart';
import 'package:flutter_application_1/translations.dart';
import 'package:flutter_application_1/utils.dart';
import 'package:flutter_application_1/widgets/input_widget.dart';
import 'package:flutter_application_1/widgets/interval_widget.dart';
import 'package:flutter_application_1/widgets/result_widget.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: CupertinoColors.white, background: CupertinoColors.white),
useMaterial3: true,
),
home: const MyHomePage(title: 'Zinseszinsrechner',),
debugShowCheckedModeBanner: false,
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
2024-05-10 13:37:09 +02:00
// Controller und Fokus-Knoten für die Eingabefelder
2024-05-06 17:28:10 +02:00
final TextEditingController _initialCapitalController = TextEditingController();
final TextEditingController _monthlySavingsRateController = TextEditingController();
final TextEditingController _interestRateController = TextEditingController();
final TextEditingController _timeController = TextEditingController();
final FocusNode _initialCapitalFocusNode = FocusNode();
final FocusNode _monthlySavingsRateFocusNode = FocusNode();
final FocusNode _interestRateFocusNode = FocusNode();
final FocusNode _timeFocusNode = FocusNode();
2024-05-10 13:37:09 +02:00
// Zustandsvariablen für die Validierung der Eingaben
bool _isInitialCapitalEntered = false;
bool _isMonthlySavingsRateEntered = false;
bool _isInterestRateEntered = false;
bool _isTimeEntered = false;
2024-05-06 17:28:10 +02:00
@override
void initState() {
super.initState();
2024-05-10 13:37:09 +02:00
// Listener für die Eingabefelder, um die Validierung durchzuführen und Standardwerte wiederherzustellen
2024-05-06 17:28:10 +02:00
_initialCapitalController.addListener(() {
setState(() {
_isInitialCapitalEntered = _initialCapitalController.text.isNotEmpty &&
isNumeric(_initialCapitalController.text);
restoreDefaultValuesIfEmpty(_initialCapitalController);
});
});
_monthlySavingsRateController.addListener(() {
setState(() {
_isMonthlySavingsRateEntered = _monthlySavingsRateController.text.isNotEmpty &&
isNumeric(_monthlySavingsRateController.text);
restoreDefaultValuesIfEmpty(_monthlySavingsRateController);
});
});
_interestRateController.addListener(() {
setState(() {
_isInterestRateEntered = _interestRateController.text.isNotEmpty &&
isNumeric(_interestRateController.text);
restoreDefaultValuesIfEmpty(_interestRateController);
});
});
_timeController.addListener(() {
setState(() {
_isTimeEntered = _timeController.text.isNotEmpty &&
isNumeric(_timeController.text);
restoreDefaultValuesIfEmpty(_timeController);
});
});
2024-05-10 13:37:09 +02:00
// Listener für die Fokus-Knoten, um die Eingabe zu runden, wenn der Fokus verloren geht
2024-05-06 17:28:10 +02:00
_initialCapitalFocusNode.addListener(() {
if (!_initialCapitalFocusNode.hasFocus) {
roundToInteger(_initialCapitalController);
}
});
_monthlySavingsRateFocusNode.addListener(() {
if (!_monthlySavingsRateFocusNode.hasFocus) {
roundToInteger(_monthlySavingsRateController);
}
});
_interestRateFocusNode.addListener(() {
if (!_interestRateFocusNode.hasFocus) {
roundToInteger(_interestRateController);
}
});
_timeFocusNode.addListener(() {
if (!_timeFocusNode.hasFocus) {
roundToInteger(_timeController);
}
});
2024-05-10 13:37:09 +02:00
// Setzen von Beispielwerten für die Eingabefelder
_initialCapitalController.text = '1000';
_monthlySavingsRateController.text = '50';
_interestRateController.text = '5';
_timeController.text = '10';
2024-05-06 17:28:10 +02:00
}
2024-05-24 14:04:26 +02:00
double _initialCapital = 0.0; // Das anfängliche Kapital
double _monthlySavingsRate = 0.0; // Der monatliche Sparbetrag
double _interestRate = 0.0; // Der jährliche Zinssatz
double _time = 0.0; // Der Anlagezeitraum in Jahren
double _investedMoney = 0.0; // Das investierte Geld
final List<double> _investedMoneyList = []; // Liste, die das investierte Geld pro Jahr speichert
PayoutInterval _payoutInterval = PayoutInterval.yearly; // Das Auszahlungsintervall (jährlich oder monatlich)
double _compoundInterest = 0.0; // Der Zinseszins
final List<double> _compoundInterestList = []; // Liste, die den Zinseszins pro Jahr speichert
2024-05-06 17:28:10 +02:00
2024-05-10 13:37:09 +02:00
// Methoden zum Festlegen der Werte aus den Eingabefeldern
2024-05-06 17:28:10 +02:00
void setInitialCapital() {
setState(() {
_initialCapital = double.parse(_initialCapitalController.text);
});
}
void setMonthlySavingsRate() {
setState(() {
_monthlySavingsRate = double.parse(_monthlySavingsRateController.text);
});
}
void setInterestRate() {
setState(() {
_interestRate = double.parse(_interestRateController.text);
});
}
void setTime() {
setState(() {
_time = double.parse(_timeController.text);
});
}
2024-05-24 14:04:26 +02:00
bool calculationPerformed = false;
2024-05-06 17:28:10 +02:00
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
buildInputWidget('Anfangskapital', _initialCapitalController, _initialCapitalFocusNode, _isInitialCapitalEntered, '', 'Das Anfangskapital ist der Betrag, den Sie zu Beginn Ihrer Anlage haben.'),
buildInputWidget('Monatliche Sparrate', _monthlySavingsRateController, _monthlySavingsRateFocusNode, _isMonthlySavingsRateEntered, '', 'Die monatliche Sparrate ist der Betrag, den Sie jeden Monat zu Ihrer Investition hinzufügen.'),
buildInputWidget('Jährlicher Zinssatz', _interestRateController, _interestRateFocusNode, _isInterestRateEntered, '%', 'Der jährliche Zinssatz ist der Prozentsatz, zu dem Ihr investiertes Kapital jedes Jahr wächst.'),
buildInputWidget('Anlagezeitraum', _timeController, _timeFocusNode, _isTimeEntered, 'Jahre', 'Der Anlagezeitraum ist die Zeitspanne, für die Sie planen, Ihr Geld anzulegen.'),
IntervalWidget(
selectedInterval: translateInterval(_payoutInterval),
onChanged: (newInterval) {
setState(() {
_payoutInterval = newInterval == 'jährlich' ? PayoutInterval.yearly : PayoutInterval.monthly;
});
},
2024-05-06 17:28:10 +02:00
),
ElevatedButton(
onPressed: () {
setInitialCapital();
setMonthlySavingsRate();
setInterestRate();
setTime();
2024-05-24 14:04:26 +02:00
_investedMoney = calculateInvestedMoney(_initialCapital, _monthlySavingsRate, _time, _investedMoneyList);
_compoundInterest = calculateCompoundInterest(_initialCapital, _monthlySavingsRate, _interestRate, _time, _payoutInterval, _investedMoneyList, _compoundInterestList);
calculationPerformed = true;
},
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all<Color>(CupertinoColors.black),
foregroundColor: MaterialStateProperty.all<Color>(CupertinoColors.white),
2024-05-24 14:04:26 +02:00
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
),
),
),
child: const Text(
'Berechnen',
style: TextStyle(
fontWeight: FontWeight.bold,
),
2024-05-06 17:28:10 +02:00
),
),
const SizedBox(height: 20),
2024-05-24 14:04:26 +02:00
if (calculationPerformed)
buildResultWidget(context, '$_compoundInterest', '$_investedMoney', '$_time', '$_monthlySavingsRate', '$_interestRate', _payoutInterval, _investedMoneyList, _compoundInterestList),
],
),
)
2024-05-06 17:28:10 +02:00
)
)
);
}
}