|
|
|
@ -1,4 +1,6 @@
|
|
|
|
|
// Flutter
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import '/models/item_type.dart';
|
|
|
|
|
|
|
|
|
@ -13,11 +15,11 @@ import '/models/tracked_item.dart';
|
|
|
|
|
/// - Fix bug where editing an item does not reflect immediately when returning to Reports page.
|
|
|
|
|
/// - Currently reflects after going back to Reports the 2nd time.
|
|
|
|
|
|
|
|
|
|
double _assetTotal = 0,
|
|
|
|
|
_expenseMonthly = 0,
|
|
|
|
|
_expenseYearly = 0,
|
|
|
|
|
_incomeMonthly = 0,
|
|
|
|
|
_incomeYearly = 0;
|
|
|
|
|
double _assetTotal = -1,
|
|
|
|
|
_expenseMonthly = -1,
|
|
|
|
|
_expenseYearly = -1,
|
|
|
|
|
_incomeMonthly = -1,
|
|
|
|
|
_incomeYearly = -1;
|
|
|
|
|
|
|
|
|
|
class ProjectionPage extends StatefulWidget {
|
|
|
|
|
const ProjectionPage({
|
|
|
|
@ -29,6 +31,18 @@ class ProjectionPage extends StatefulWidget {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class _ProjectionPageState extends State<ProjectionPage> {
|
|
|
|
|
bool _showProjections = true;
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void dispose() {
|
|
|
|
|
_assetTotal = -2;
|
|
|
|
|
_expenseMonthly = -2;
|
|
|
|
|
_expenseYearly = -2;
|
|
|
|
|
_incomeMonthly = -2;
|
|
|
|
|
_incomeYearly = -2;
|
|
|
|
|
super.dispose();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
// Summaries for display as well as calculation of totals for projections.
|
|
|
|
@ -46,50 +60,82 @@ class _ProjectionPageState extends State<ProjectionPage> {
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Calculations for the projections.
|
|
|
|
|
double oneMonth = _assetTotal + _incomeMonthly - _expenseMonthly,
|
|
|
|
|
threeMonths = _assetTotal + (3 * (_incomeMonthly - _expenseMonthly)),
|
|
|
|
|
sixMonths = _assetTotal + (6 * (_incomeMonthly - _expenseMonthly)),
|
|
|
|
|
oneYear = _assetTotal + (_incomeYearly - _expenseYearly),
|
|
|
|
|
twoYears = _assetTotal + (2 * (_incomeYearly - _expenseYearly)),
|
|
|
|
|
fiveYears = _assetTotal + (5 * (_incomeYearly - _expenseYearly));
|
|
|
|
|
Widget projections;
|
|
|
|
|
if (_assetTotal < 0 ||
|
|
|
|
|
_incomeMonthly < 0 ||
|
|
|
|
|
_incomeYearly < 0 ||
|
|
|
|
|
_expenseMonthly < 0 ||
|
|
|
|
|
_expenseYearly < 0) {
|
|
|
|
|
_showProjections = false;
|
|
|
|
|
|
|
|
|
|
// Widgets to show the projections.
|
|
|
|
|
Widget proj1 = SummaryCard(
|
|
|
|
|
name: "One month from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: oneMonth.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj2 = SummaryCard(
|
|
|
|
|
name: "Three months from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: threeMonths.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj3 = SummaryCard(
|
|
|
|
|
name: "Half a year from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: sixMonths.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj4 = SummaryCard(
|
|
|
|
|
name: "One year from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: oneYear.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj5 = SummaryCard(
|
|
|
|
|
name: "Two years from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: twoYears.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj6 = SummaryCard(
|
|
|
|
|
name: "Five years from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: fiveYears.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
projections = Center(
|
|
|
|
|
child: SizedBox(
|
|
|
|
|
child: CircularProgressIndicator(),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Future.delayed(Duration(seconds: 1), () {
|
|
|
|
|
setState(() {
|
|
|
|
|
_showProjections = true;
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
double oneMonth = _assetTotal + _incomeMonthly - _expenseMonthly,
|
|
|
|
|
threeMonths = _assetTotal + (3 * (_incomeMonthly - _expenseMonthly)),
|
|
|
|
|
sixMonths = _assetTotal + (6 * (_incomeMonthly - _expenseMonthly)),
|
|
|
|
|
oneYear = _assetTotal + (_incomeYearly - _expenseYearly),
|
|
|
|
|
twoYears = _assetTotal + (2 * (_incomeYearly - _expenseYearly)),
|
|
|
|
|
fiveYears = _assetTotal + (5 * (_incomeYearly - _expenseYearly));
|
|
|
|
|
|
|
|
|
|
// Widgets to show the projections.
|
|
|
|
|
Widget proj1 = SummaryCard(
|
|
|
|
|
name: "One month from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: oneMonth.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj2 = SummaryCard(
|
|
|
|
|
name: "Three months from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: threeMonths.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj3 = SummaryCard(
|
|
|
|
|
name: "Half a year from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: sixMonths.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj4 = SummaryCard(
|
|
|
|
|
name: "One year from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: oneYear.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj5 = SummaryCard(
|
|
|
|
|
name: "Two years from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: twoYears.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
Widget proj6 = SummaryCard(
|
|
|
|
|
name: "Five years from now...",
|
|
|
|
|
leftText: "",
|
|
|
|
|
middleText: fiveYears.toStringAsFixed(2),
|
|
|
|
|
rightText: "",
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
projections = Column(
|
|
|
|
|
children: [
|
|
|
|
|
proj1,
|
|
|
|
|
proj2,
|
|
|
|
|
proj3,
|
|
|
|
|
proj4,
|
|
|
|
|
proj5,
|
|
|
|
|
proj6,
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Return all of the UI elements.
|
|
|
|
|
return ListView(
|
|
|
|
@ -99,12 +145,7 @@ class _ProjectionPageState extends State<ProjectionPage> {
|
|
|
|
|
incomeSummary,
|
|
|
|
|
assetSummary,
|
|
|
|
|
TitleCard(title: "Projections"),
|
|
|
|
|
proj1,
|
|
|
|
|
proj2,
|
|
|
|
|
proj3,
|
|
|
|
|
proj4,
|
|
|
|
|
proj5,
|
|
|
|
|
proj6,
|
|
|
|
|
projections,
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|