Compare commits
	
		
			6 Commits
		
	
	
		
			0.1.1
			...
			147178e4dd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 147178e4dd | |||
| c39e09b2b6 | |||
| fa852faadc | |||
| 6f9d0d8afb | |||
| 75cc72678b | |||
| 2970431b91 | 
| @@ -1,4 +1,6 @@ | |||||||
| // Flutter | // Flutter | ||||||
|  | import 'dart:async'; | ||||||
|  |  | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import '/models/item_type.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. | ///   - 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. | ///     - Currently reflects after going back to Reports the 2nd time. | ||||||
|  |  | ||||||
| double _assetTotal = 0, | double _assetTotal = -1, | ||||||
|     _expenseMonthly = 0, |     _expenseMonthly = -1, | ||||||
|     _expenseYearly = 0, |     _expenseYearly = -1, | ||||||
|     _incomeMonthly = 0, |     _incomeMonthly = -1, | ||||||
|     _incomeYearly = 0; |     _incomeYearly = -1; | ||||||
|  |  | ||||||
| class ProjectionPage extends StatefulWidget { | class ProjectionPage extends StatefulWidget { | ||||||
|   const ProjectionPage({ |   const ProjectionPage({ | ||||||
| @@ -29,23 +31,55 @@ class ProjectionPage extends StatefulWidget { | |||||||
| } | } | ||||||
|  |  | ||||||
| class _ProjectionPageState extends State<ProjectionPage> { | class _ProjectionPageState extends State<ProjectionPage> { | ||||||
|  |   bool _showProjections = true; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   void dispose() { | ||||||
|  |     _assetTotal = -2; | ||||||
|  |     _expenseMonthly = -2; | ||||||
|  |     _expenseYearly = -2; | ||||||
|  |     _incomeMonthly = -2; | ||||||
|  |     _incomeYearly = -2; | ||||||
|  |     super.dispose(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     // Summaries for display as well as calculation of totals for projections. |     // Summaries for display as well as calculation of totals for projections. | ||||||
|     Widget expenseSummary = SummaryCardForTotals( |     Widget expenseSummary = SummaryCardForTotals( | ||||||
|       list: DatabaseHelper.instance.getExpenses(), |       list: DatabaseHelper.instance.getExpenses(), | ||||||
|       summaryTypeLabel: ItemType.expense.title, |       itemType: ItemType.expense, | ||||||
|     ); |     ); | ||||||
|     Widget incomeSummary = SummaryCardForTotals( |     Widget incomeSummary = SummaryCardForTotals( | ||||||
|       list: DatabaseHelper.instance.getIncomes(), |       list: DatabaseHelper.instance.getIncomes(), | ||||||
|       summaryTypeLabel: ItemType.income.title, |       itemType: ItemType.income, | ||||||
|     ); |     ); | ||||||
|     Widget assetSummary = SummaryCardForTotals( |     Widget assetSummary = SummaryCardForTotals( | ||||||
|       list: DatabaseHelper.instance.getAssets(), |       list: DatabaseHelper.instance.getAssets(), | ||||||
|       summaryTypeLabel: ItemType.asset.title, |       itemType: ItemType.asset, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     // Calculations for the projections. |     // Calculations for the projections. | ||||||
|  |     Widget projections; | ||||||
|  |     if (_assetTotal < 0 || | ||||||
|  |         _incomeMonthly < 0 || | ||||||
|  |         _incomeYearly < 0 || | ||||||
|  |         _expenseMonthly < 0 || | ||||||
|  |         _expenseYearly < 0) { | ||||||
|  |       _showProjections = false; | ||||||
|  |  | ||||||
|  |       projections = Center( | ||||||
|  |         child: SizedBox( | ||||||
|  |           child: CircularProgressIndicator(), | ||||||
|  |         ), | ||||||
|  |       ); | ||||||
|  |  | ||||||
|  |       Future.delayed(Duration(seconds: 1), () { | ||||||
|  |         setState(() { | ||||||
|  |           _showProjections = true; | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|  |     } else { | ||||||
|       double oneMonth = _assetTotal + _incomeMonthly - _expenseMonthly, |       double oneMonth = _assetTotal + _incomeMonthly - _expenseMonthly, | ||||||
|           threeMonths = _assetTotal + (3 * (_incomeMonthly - _expenseMonthly)), |           threeMonths = _assetTotal + (3 * (_incomeMonthly - _expenseMonthly)), | ||||||
|           sixMonths = _assetTotal + (6 * (_incomeMonthly - _expenseMonthly)), |           sixMonths = _assetTotal + (6 * (_incomeMonthly - _expenseMonthly)), | ||||||
| @@ -91,14 +125,8 @@ class _ProjectionPageState extends State<ProjectionPage> { | |||||||
|         rightText: "", |         rightText: "", | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|     // Return all of the UI elements. |       projections = Column( | ||||||
|     return ListView( |  | ||||||
|         children: [ |         children: [ | ||||||
|         TitleCard(title: "Summaries"), |  | ||||||
|         expenseSummary, |  | ||||||
|         incomeSummary, |  | ||||||
|         assetSummary, |  | ||||||
|         TitleCard(title: "Projections"), |  | ||||||
|           proj1, |           proj1, | ||||||
|           proj2, |           proj2, | ||||||
|           proj3, |           proj3, | ||||||
| @@ -108,20 +136,35 @@ class _ProjectionPageState extends State<ProjectionPage> { | |||||||
|         ], |         ], | ||||||
|       ); |       ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Return all of the UI elements. | ||||||
|  |     return ListView( | ||||||
|  |       children: [ | ||||||
|  |         TitleCard(title: "Summaries"), | ||||||
|  |         expenseSummary, | ||||||
|  |         incomeSummary, | ||||||
|  |         assetSummary, | ||||||
|  |         TitleCard(title: "Projections"), | ||||||
|  |         projections, | ||||||
|  |       ], | ||||||
|  |     ); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| class SummaryCardForTotals extends StatelessWidget { | class SummaryCardForTotals extends StatelessWidget { | ||||||
|   const SummaryCardForTotals({ |   const SummaryCardForTotals({ | ||||||
|     super.key, |     super.key, | ||||||
|     required this.list, |     required this.list, | ||||||
|     required this.summaryTypeLabel, |     required this.itemType, | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   final Future<List<TrackedItem>> list; |   final Future<List<TrackedItem>> list; | ||||||
|   final String summaryTypeLabel; |   final ItemType itemType; | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|  |     String summaryTypeLabel = itemType.title.toString(); | ||||||
|  |  | ||||||
|     return FutureBuilder<List<TrackedItem>>( |     return FutureBuilder<List<TrackedItem>>( | ||||||
|         future: list, |         future: list, | ||||||
|         builder: ( |         builder: ( | ||||||
| @@ -134,12 +177,9 @@ class SummaryCardForTotals extends StatelessWidget { | |||||||
|  |  | ||||||
|           // Calculate the total fields based on item type. |           // Calculate the total fields based on item type. | ||||||
|           double dailyTotal = 0, monthlyTotal = 0, yearlyTotal = 0; |           double dailyTotal = 0, monthlyTotal = 0, yearlyTotal = 0; | ||||||
|           ItemType? itemType; |  | ||||||
|           for (TrackedItem e in snapshot.data!) { |           for (TrackedItem e in snapshot.data!) { | ||||||
|             if (itemType == null) { |             if (e.type != itemType) { | ||||||
|               itemType = e.type!; |               throw "List in SummaryCardForTotals has incorrect item types, abort!"; | ||||||
|             } else if (itemType != e.type) { |  | ||||||
|               throw "List in SummaryCardForTotals has multiple item types, abort!"; |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (e.type == ItemType.asset) { |             if (e.type == ItemType.asset) { | ||||||
| @@ -153,9 +193,6 @@ class SummaryCardForTotals extends StatelessWidget { | |||||||
|  |  | ||||||
|           /* Load page variables based on calculated totals. */ |           /* Load page variables based on calculated totals. */ | ||||||
|           switch (itemType) { |           switch (itemType) { | ||||||
|             case null: |  | ||||||
|               break; |  | ||||||
|  |  | ||||||
|             case ItemType.asset: |             case ItemType.asset: | ||||||
|               _assetTotal = monthlyTotal; |               _assetTotal = monthlyTotal; | ||||||
|               break; |               break; | ||||||
|   | |||||||
| @@ -337,6 +337,7 @@ class _TrackedItemInputDialogState extends State<TrackedItemInputDialog> { | |||||||
|                 : Text("Edit ${_type!.title}"), |                 : Text("Edit ${_type!.title}"), | ||||||
|           ), |           ), | ||||||
|           content: FutureBuilder<List<Expense>>( |           content: FutureBuilder<List<Expense>>( | ||||||
|  |               // TODO / TBD -- This should no longer only be Expenses. | ||||||
|               future: DatabaseHelper.instance.getExpenses(), |               future: DatabaseHelper.instance.getExpenses(), | ||||||
|               builder: (BuildContext context, |               builder: (BuildContext context, | ||||||
|                   AsyncSnapshot<List<Expense>> snapshot) { |                   AsyncSnapshot<List<Expense>> snapshot) { | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| name: expense_tracker | name: expense_tracker | ||||||
| description: Track recurring expenses against income and liquid assets. | description: Track recurring expenses against income and liquid assets. | ||||||
| publish_to: 'none' | publish_to: 'none' | ||||||
| version: 0.1.1 | version: 0.1.3 | ||||||
|  |  | ||||||
| environment: | environment: | ||||||
|   sdk: ^3.6.1 |   sdk: ^3.6.1 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user