2024-05-06 17:28:10 +02:00
import ' package:flutter/material.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/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
}
double _initialCapital = 0.0 ; // Anfangskapital
double _monthlySavingsRate = 0.0 ; // Monatliche Sparrate
double _interestRate = 0.0 ; // Jährlicher Zinssatz
double _time = 0.0 ; // Anlagezeitraum in Jahren
double _investedMoney = 0.0 ; // Investiertes Geld ohne Zinsen
2024-05-10 13:37:09 +02:00
final List < double > _investedMoneyList = [ ] ; // Investiertes Geld ohne Zinsen (pro Jahr)
2024-05-06 17:28:10 +02:00
PayoutInterval _payoutInterval = PayoutInterval . yearly ; // Standardwert für das Ausschüttungsintervall
double _compoundInterest = 0.0 ; // Investiertes Geld mit Zinsen
2024-05-10 13:37:09 +02:00
final List < double > _compoundInterestList = [ ] ; // Investiertes Geld mit Zinsen (pro Jahr)
2024-05-06 17:28:10 +02:00
bool _calculationPerformed = false ;
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-10 13:37:09 +02:00
// Methode zum Berechnen des investierten Geldes
2024-05-06 17:28:10 +02:00
void _calculateInvestedMoney ( ) {
setState ( ( ) {
_investedMoneyList . clear ( ) ;
_investedMoney = _initialCapital ;
for ( int i = 0 ; i < _time ; i + + ) {
_investedMoney + = _monthlySavingsRate * 12 ;
_investedMoney = _investedMoney . roundToDouble ( ) ;
_investedMoneyList . add ( _investedMoney ) ;
}
_calculationPerformed = true ;
} ) ;
}
2024-05-10 13:37:09 +02:00
// Methode zum Berechnen der Zinsen
2024-05-06 17:28:10 +02:00
void _calculateCompoundInterest ( ) {
setState ( ( ) {
_compoundInterestList . clear ( ) ;
_compoundInterest = _initialCapital ;
if ( _payoutInterval = = PayoutInterval . yearly ) {
for ( int i = 0 ; i < _time ; i + + ) {
_compoundInterest + = _compoundInterest * ( _interestRate / 100 ) + _monthlySavingsRate * 12 ;
_compoundInterest = _compoundInterest . roundToDouble ( ) ;
_compoundInterestList . add ( _compoundInterest - _investedMoneyList [ i ] ) ;
}
}
else {
for ( int i = 0 ; i < _time ; i + + ) {
for ( int j = 0 ; j < 12 ; j + + ) {
_compoundInterest + = _compoundInterest * ( ( _interestRate / 100 ) / 12 ) + _monthlySavingsRate ;
_compoundInterest = _compoundInterest . roundToDouble ( ) ;
}
_compoundInterestList . add ( _compoundInterest - _investedMoneyList [ i ] ) ;
}
}
_calculationPerformed = true ;
} ) ;
}
@ override
Widget build ( BuildContext context ) {
return Scaffold (
2024-05-20 16:34:31 +02:00
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
) ,
2024-05-20 16:34:31 +02:00
ElevatedButton (
onPressed: ( ) {
setInitialCapital ( ) ;
setMonthlySavingsRate ( ) ;
setInterestRate ( ) ;
setTime ( ) ;
_calculateInvestedMoney ( ) ;
_calculateCompoundInterest ( ) ;
} ,
style: ButtonStyle (
backgroundColor: MaterialStateProperty . all < Color > ( CupertinoColors . black ) ,
foregroundColor: MaterialStateProperty . all < Color > ( CupertinoColors . white ) ,
) ,
child: const Text (
' Berechnen ' ,
style: TextStyle (
fontWeight: FontWeight . bold ,
) ,
2024-05-06 17:28:10 +02:00
) ,
) ,
2024-05-20 16:34:31 +02:00
const SizedBox ( height: 20 ) ,
if ( _calculationPerformed )
buildResultWidget ( ' $ _compoundInterest ' , ' $ _investedMoney ' , ' $ _time ' , ' $ _monthlySavingsRate ' , ' $ _interestRate ' , _payoutInterval , _investedMoneyList , _compoundInterestList ) ,
] ,
) ,
)
2024-05-06 17:28:10 +02:00
)
)
) ;
}
}