From 64e680ec6f8cb6fbafc15ff5fff4ed306acdfc39 Mon Sep 17 00:00:00 2001 From: marcoabat Date: Sat, 5 Aug 2023 14:35:19 +0200 Subject: [PATCH] Added Provider and DetailPage --- lib/main.dart | 10 +++++- lib/pages/dashboard_page.dart | 15 ++++++++- lib/pages/detail_checklist_page.dart | 50 ++++++++++++++++++++++++++-- lib/services/checklist_provider.dart | 12 +++++++ lib/services/dbhelper.dart | 4 +++ pubspec.lock | 16 +++++++++ pubspec.yaml | 1 + 7 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 lib/services/checklist_provider.dart diff --git a/lib/main.dart b/lib/main.dart index 309b5d6..6f799df 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,10 @@ +import 'package:briessenchecker/pages/detail_checklist_page.dart'; import 'package:briessenchecker/pages/edit_checklist_page.dart'; +import 'package:briessenchecker/services/checklist_provider.dart'; import 'package:briessenchecker/services/dbhelper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:provider/provider.dart'; import 'pages/dashboard_page.dart'; import 'pages/landing_page.dart'; import 'pages/login_page.dart'; @@ -9,7 +12,11 @@ import 'pages/login_page.dart'; void main() async { await dotenv.load(fileName: 'secrets.env'); await DbHelper.init(); - runApp(const MyApp()); + runApp(MultiProvider(providers: [ + ChangeNotifierProvider( + create: (_) => ChecklistProvider(), + ), + ], child: const MyApp())); } class MyApp extends StatelessWidget { @@ -30,6 +37,7 @@ class MyApp extends StatelessWidget { LoginPage.routeName: (context) => const LoginPage(), DashboardPage.routeName: (context) => const DashboardPage(), EditChecklistPage.routeName: (context) => const EditChecklistPage(), + DetailChecklistPage.routeName: (context) => const DetailChecklistPage(), }, ); } diff --git a/lib/pages/dashboard_page.dart b/lib/pages/dashboard_page.dart index 980579e..2f0515a 100644 --- a/lib/pages/dashboard_page.dart +++ b/lib/pages/dashboard_page.dart @@ -1,6 +1,9 @@ import 'package:briessenchecker/models/checklist.dart'; +import 'package:briessenchecker/pages/detail_checklist_page.dart'; +import 'package:briessenchecker/services/checklist_provider.dart'; import 'package:briessenchecker/services/dbhelper.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class DashboardPage extends StatefulWidget { const DashboardPage({super.key}); @@ -12,9 +15,16 @@ class DashboardPage extends StatefulWidget { class _DashboardPageState extends State { final Future> checklistFuture = DbHelper.fetchChecklist; + late ChecklistProvider checklistProvider; + + @override + void initState() { + super.initState(); + } @override Widget build(BuildContext context) { + checklistProvider = Provider.of(context, listen: true); return Scaffold( body: FutureBuilder( future: checklistFuture, @@ -49,6 +59,9 @@ class _DashboardPageState extends State { } void _onAddTapped() { - DbHelper.addChecklist().then((id) {}); + DbHelper.addChecklist().then((id) { + checklistProvider.updateSelectedChecklist(id, silent: true); + }); + Navigator.of(context).pushNamed(DetailChecklistPage.routeName); } } diff --git a/lib/pages/detail_checklist_page.dart b/lib/pages/detail_checklist_page.dart index d9751bf..20ef37d 100644 --- a/lib/pages/detail_checklist_page.dart +++ b/lib/pages/detail_checklist_page.dart @@ -1,10 +1,56 @@ +import 'package:briessenchecker/models/checklist.dart'; +import 'package:briessenchecker/services/checklist_provider.dart'; +import 'package:briessenchecker/services/dbhelper.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; -class DetailChecklistPage extends StatelessWidget { +class DetailChecklistPage extends StatefulWidget { const DetailChecklistPage({super.key}); static const routeName = '/detail'; + + @override + State createState() => _DetailChecklistPageState(); +} + +class _DetailChecklistPageState extends State { + late final ChecklistProvider checklistProvider; + late Future checklistFuture; + + @override + void initState() { + super.initState(); + checklistProvider = Provider.of(context, listen: false); + checklistFuture = + DbHelper.getChecklistById(checklistProvider.selectedChecklistId!); + } + + @override + void dispose() { + super.dispose(); + checklistProvider.updateSelectedChecklist(null, silent: true); + } + @override Widget build(BuildContext context) { - return const Placeholder(); + return Scaffold( + body: FutureBuilder( + future: checklistFuture, + builder: _futureBuilder, + ), + ); + } + + Widget _futureBuilder( + BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return Column( + children: [ + Text(snapshot.data!.title), + Text(snapshot.data!.description), + ], + ); + } else { + return const CircularProgressIndicator(); + } } } diff --git a/lib/services/checklist_provider.dart b/lib/services/checklist_provider.dart new file mode 100644 index 0000000..0cce9f2 --- /dev/null +++ b/lib/services/checklist_provider.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class ChecklistProvider extends ChangeNotifier { + int? _selectedChecklistId; + + updateSelectedChecklist(int? checklistId, {bool silent = false}) { + _selectedChecklistId = checklistId; + if (!silent) notifyListeners(); + } + + int? get selectedChecklistId => _selectedChecklistId; +} diff --git a/lib/services/dbhelper.dart b/lib/services/dbhelper.dart index 2073030..de708b9 100644 --- a/lib/services/dbhelper.dart +++ b/lib/services/dbhelper.dart @@ -34,6 +34,10 @@ class DbHelper { return 0; } + static Future getChecklistById(int id) async { + return ed.checklists.first; + } + static Stream get authChangeEventStream => _client.auth.onAuthStateChange; } diff --git a/pubspec.lock b/pubspec.lock index c742efc..61d8e81 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -224,6 +224,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" path: dependency: transitive description: @@ -304,6 +312,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + provider: + dependency: "direct main" + description: + name: provider + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.dev" + source: hosted + version: "6.0.5" realtime_client: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index cbf0b0d..8c0d179 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,6 +37,7 @@ dependencies: cupertino_icons: ^1.0.2 supabase_flutter: ^1.10.11 flutter_dotenv: ^5.1.0 + provider: ^6.0.5 dev_dependencies: flutter_test: