Successfully migrate the application to SQLIte!

This commit is contained in:
2025-02-07 15:29:20 -07:00
parent 5425b22ba2
commit ef58a06dfa
8 changed files with 535 additions and 292 deletions
+28 -115
View File
@@ -2,16 +2,36 @@
import 'package:flutter/material.dart';
// Local
import '/pages/expense.dart';
import '/pages/income.dart';
import '/pages/asset.dart';
import '/pages/report.dart';
import '/pages/settings.dart';
import '/pages/help.dart';
import '/db.dart';
import '/pages/home.dart';
// SQLite
import 'dart:io';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
const bool testing = true;
void main() {
loadDB();
// I see no good explanations of why to use this other package yet, but
// trying this to see if it fixes the DB factory errors.
// "Unhandled Exception: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi`You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API
// https://stackoverflow.com/questions/76158800/databasefactory-not-initialized-when-using-sqflite-in-flutter
if (Platform.isWindows || Platform.isLinux) {
// Initialize FFI
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
WidgetsFlutterBinding.ensureInitialized();
if (testing) {
() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, 'com_hyperling_expense.db');
await deleteDatabase(path);
}();
}
runApp(const MainApp());
}
@@ -36,110 +56,3 @@ class MainApp extends StatelessWidget {
);
}
}
class HomePage extends StatefulWidget {
const HomePage({
super.key,
});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
var pageSelected = 0;
refresh() {
setState(() {});
}
@override
Widget build(BuildContext context) {
Widget page;
Widget? dialog;
switch (pageSelected) {
case 0:
page = ExpensePage();
dialog = ExpenseInputDialog(
notifyParent: refresh,
);
case 1:
page = IncomePage();
case 2:
page = AssetPage();
case 3:
page = ProjectionPage();
case 4:
page = SettingsPage();
case 5:
page = HelpPage();
default:
throw UnimplementedError('No widget for page $pageSelected yet!');
}
Future<void> addNewValue(BuildContext context) {
return showDialog(
context: context,
builder: (_) => AlertDialog(content: dialog),
);
}
Widget? floatingButton;
if (dialog != null) {
floatingButton = IconButton(
onPressed: () {
addNewValue(context);
},
icon: Icon(Icons.add),
color: Theme.of(context).colorScheme.onSurface,
);
}
return LayoutBuilder(builder: (context, constraints) {
return Scaffold(
appBar: AppBar(title: Text("Expense Tracker")),
drawer: NavigationRail(
extended: true,
destinations: [
NavigationRailDestination(
icon: Icon(Icons.payment),
label: Text('Expenses'),
),
NavigationRailDestination(
icon: Icon(Icons.account_balance),
label: Text('Income'),
),
NavigationRailDestination(
icon: Icon(Icons.attach_money),
label: Text('Liquid Assets'),
),
NavigationRailDestination(
icon: Icon(Icons.bar_chart),
label: Text('Reports'),
),
NavigationRailDestination(
icon: Icon(Icons.settings),
label: Text('Settings'),
),
NavigationRailDestination(
icon: Icon(Icons.help),
label: Text('Help'),
),
],
selectedIndex: pageSelected,
onDestinationSelected: (value) {
setState(() {
pageSelected = value;
Navigator.pop(context);
});
},
),
body: Container(
color: Theme.of(context).colorScheme.primaryContainer,
child: Center(child: page),
),
floatingActionButton: floatingButton,
);
});
}
}