From d1c34bd60784d877d8ac6645050dc88621d1ed21 Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Tue, 9 Sep 2025 13:13:55 +0200 Subject: [PATCH] State -> FirkaState Add a helper called FirkaState which registers a listener to globalUpdate, so that we can invalidate every widget that is active --- firka/lib/helpers/firka_state.dart | 32 +++++++++++++++++++ firka/lib/main.dart | 1 + .../lib/ui/phone/pages/home/home_grades.dart | 3 +- .../phone/pages/home/home_grades_subject.dart | 3 +- firka/lib/ui/phone/pages/home/home_main.dart | 3 +- .../lib/ui/phone/pages/home/home_subpage.dart | 17 +++++----- .../ui/phone/pages/home/home_timetable.dart | 3 +- .../phone/pages/home/home_timetable_mo.dart | 4 ++- .../ui/phone/screens/debug/debug_screen.dart | 3 +- .../ui/phone/screens/home/beta_screen.dart | 7 ++-- .../ui/phone/screens/home/home_screen.dart | 3 +- .../ui/phone/screens/login/login_screen.dart | 3 +- .../screens/settings/settings_screen.dart | 3 +- .../screens/wear_login/wear_login_screen.dart | 3 +- firka/lib/ui/phone/widgets/login_webview.dart | 3 +- firka/lib/ui/widget/delayed_spinner.dart | 3 +- 16 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 firka/lib/helpers/firka_state.dart diff --git a/firka/lib/helpers/firka_state.dart b/firka/lib/helpers/firka_state.dart new file mode 100644 index 0000000..d525650 --- /dev/null +++ b/firka/lib/helpers/firka_state.dart @@ -0,0 +1,32 @@ +import 'package:firka/main.dart'; +import 'package:flutter/widgets.dart'; + +abstract class FirkaState extends State { + @override + @mustCallSuper + void initState() { + super.initState(); + globalUpdate.addListener(_doUpdate); + } + + void _doUpdate() { + if (mounted) setState(() {}); + } + + @override + @mustCallSuper + void didChangeDependencies() { + super.didChangeDependencies(); + + globalUpdate.removeListener(_doUpdate); + globalUpdate.addListener(_doUpdate); + } + + @override + @mustCallSuper + void dispose() { + super.dispose(); + + globalUpdate.removeListener(_doUpdate); + } +} diff --git a/firka/lib/main.dart b/firka/lib/main.dart index c65f6b5..a03616e 100644 --- a/firka/lib/main.dart +++ b/firka/lib/main.dart @@ -256,6 +256,7 @@ void main() async { } final ValueNotifier isLightMode = ValueNotifier(true); +final UpdateNotifier globalUpdate = UpdateNotifier(); class InitializationScreen extends StatelessWidget { InitializationScreen({super.key}); diff --git a/firka/lib/ui/phone/pages/home/home_grades.dart b/firka/lib/ui/phone/pages/home/home_grades.dart index 75c5b7a..9333d27 100644 --- a/firka/lib/ui/phone/pages/home/home_grades.dart +++ b/firka/lib/ui/phone/pages/home/home_grades.dart @@ -11,6 +11,7 @@ import '../../../../helpers/api/model/grade.dart'; import '../../../../helpers/api/model/subject.dart'; import '../../../../helpers/api/model/timetable.dart'; import '../../../../helpers/debug_helper.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/update_notifier.dart'; import '../../../../main.dart'; import '../../../model/style.dart'; @@ -32,7 +33,7 @@ class HomeGradesScreen extends StatefulWidget { String activeSubjectUid = ""; -class _HomeGradesScreen extends State { +class _HomeGradesScreen extends FirkaState { ApiResponse>? grades; ApiResponse>? week; ApiResponse>? classGroups; diff --git a/firka/lib/ui/phone/pages/home/home_grades_subject.dart b/firka/lib/ui/phone/pages/home/home_grades_subject.dart index fe771cf..8f55503 100644 --- a/firka/lib/ui/phone/pages/home/home_grades_subject.dart +++ b/firka/lib/ui/phone/pages/home/home_grades_subject.dart @@ -5,6 +5,7 @@ import 'package:firka/helpers/ui/grade.dart'; import 'package:firka/ui/phone/pages/home/home_grades.dart'; import 'package:flutter/material.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/update_notifier.dart'; import '../../../../main.dart'; import '../../../model/style.dart'; @@ -23,7 +24,7 @@ class HomeGradesSubjectScreen extends StatefulWidget { State createState() => _HomeGradesSubjectScreen(); } -class _HomeGradesSubjectScreen extends State { +class _HomeGradesSubjectScreen extends FirkaState { Iterable? grades; @override diff --git a/firka/lib/ui/phone/pages/home/home_main.dart b/firka/lib/ui/phone/pages/home/home_main.dart index 3865624..9181e06 100644 --- a/firka/lib/ui/phone/pages/home/home_main.dart +++ b/firka/lib/ui/phone/pages/home/home_main.dart @@ -13,6 +13,7 @@ import '../../../../helpers/api/model/student.dart'; import '../../../../helpers/api/model/test.dart'; import '../../../../helpers/api/model/timetable.dart'; import '../../../../helpers/debug_helper.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/ui/firka_card.dart'; import '../../../../helpers/update_notifier.dart'; import '../../../../main.dart'; @@ -33,7 +34,7 @@ class HomeMainScreen extends StatefulWidget { State createState() => _HomeMainScreen(); } -class _HomeMainScreen extends State { +class _HomeMainScreen extends FirkaState { _HomeMainScreen(); DateTime now = timeNow(); diff --git a/firka/lib/ui/phone/pages/home/home_subpage.dart b/firka/lib/ui/phone/pages/home/home_subpage.dart index a2b0b53..95a9c13 100644 --- a/firka/lib/ui/phone/pages/home/home_subpage.dart +++ b/firka/lib/ui/phone/pages/home/home_subpage.dart @@ -1,21 +1,23 @@ import 'package:flutter/material.dart'; +import '../../../../helpers/firka_state.dart'; + class PageWithSubPages extends StatefulWidget { final int pageIndex; final List subPages; - - const PageWithSubPages(this.subPages, {Key? key, required this.pageIndex}) : super(key: key); - + + const PageWithSubPages(this.subPages, {Key? key, required this.pageIndex}) + : super(key: key); + @override _PageWithSubPagesState createState() => _PageWithSubPagesState(); } -class _PageWithSubPagesState extends State { +class _PageWithSubPagesState extends FirkaState { int _currentSubPage = 0; - + @override Widget build(BuildContext context) { - return Scaffold( body: widget.subPages[_currentSubPage]((page) { setState(() { @@ -24,5 +26,4 @@ class _PageWithSubPagesState extends State { }), ); } - -} \ No newline at end of file +} diff --git a/firka/lib/ui/phone/pages/home/home_timetable.dart b/firka/lib/ui/phone/pages/home/home_timetable.dart index c85102d..2f416f2 100644 --- a/firka/lib/ui/phone/pages/home/home_timetable.dart +++ b/firka/lib/ui/phone/pages/home/home_timetable.dart @@ -12,6 +12,7 @@ import 'package:majesticons_flutter/majesticons_flutter.dart'; import 'package:transparent_pointer/transparent_pointer.dart'; import '../../../../helpers/api/consts.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/update_notifier.dart'; import '../../../../main.dart'; import '../../../widget/firka_icon.dart'; @@ -32,7 +33,7 @@ class HomeTimetableScreen extends StatefulWidget { State createState() => _HomeTimetableScreen(); } -class _HomeTimetableScreen extends State { +class _HomeTimetableScreen extends FirkaState { List? lessons; List? events; List? tests; diff --git a/firka/lib/ui/phone/pages/home/home_timetable_mo.dart b/firka/lib/ui/phone/pages/home/home_timetable_mo.dart index 53a2bcd..c45d2ac 100644 --- a/firka/lib/ui/phone/pages/home/home_timetable_mo.dart +++ b/firka/lib/ui/phone/pages/home/home_timetable_mo.dart @@ -12,6 +12,7 @@ import 'package:majesticons_flutter/majesticons_flutter.dart'; import 'package:transparent_pointer/transparent_pointer.dart'; import '../../../../helpers/api/model/test.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/update_notifier.dart'; import '../../../../main.dart'; import '../../../widget/firka_icon.dart'; @@ -34,7 +35,8 @@ class HomeTimetableMonthlyScreen extends StatefulWidget { enum ActiveFilter { lessonNo, tests, omissions } -class _HomeTimetableMonthlyScreen extends State { +class _HomeTimetableMonthlyScreen + extends FirkaState { List? lessons; List? tests; List? dates; diff --git a/firka/lib/ui/phone/screens/debug/debug_screen.dart b/firka/lib/ui/phone/screens/debug/debug_screen.dart index 83a6c3b..83813eb 100644 --- a/firka/lib/ui/phone/screens/debug/debug_screen.dart +++ b/firka/lib/ui/phone/screens/debug/debug_screen.dart @@ -13,6 +13,7 @@ import 'package:image_picker/image_picker.dart'; import '../../../../helpers/debug_helper.dart'; import '../../../../helpers/firka_bundle.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../widget/firka_icon.dart'; class DebugScreen extends StatefulWidget { @@ -24,7 +25,7 @@ class DebugScreen extends StatefulWidget { State createState() => _DebugScreen(); } -class _DebugScreen extends State { +class _DebugScreen extends FirkaState { _DebugScreen(); late ImagePicker _picker; diff --git a/firka/lib/ui/phone/screens/home/beta_screen.dart b/firka/lib/ui/phone/screens/home/beta_screen.dart index 437040e..9969600 100644 --- a/firka/lib/ui/phone/screens/home/beta_screen.dart +++ b/firka/lib/ui/phone/screens/home/beta_screen.dart @@ -8,6 +8,7 @@ import 'package:firka/ui/model/style.dart'; import 'package:firka/ui/phone/screens/home/home_screen.dart'; import 'package:flutter/material.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../main.dart'; class BetaScreen extends StatefulWidget { @@ -19,7 +20,7 @@ class BetaScreen extends StatefulWidget { State createState() => _BetaScreenState(); } -class _BetaScreenState extends State { +class _BetaScreenState extends FirkaState { late Timer timer; int counter = 5; @@ -85,7 +86,9 @@ class _BetaScreenState extends State { ), GestureDetector( child: FirkaButton( - text: counter == 0 ? widget.data.l10n.okay : "${widget.data.l10n.okay} ($counter)", + text: counter == 0 + ? widget.data.l10n.okay + : "${widget.data.l10n.okay} ($counter)", bgColor: counter == 0 ? appStyle.colors.accent : appStyle.colors.secondary, diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index 62075e5..0957839 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -26,6 +26,7 @@ import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; import '../../../../helpers/db/widget.dart'; import '../../../../helpers/debug_helper.dart'; import '../../../../helpers/firka_bundle.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/image_preloader.dart'; import '../../../widget/delayed_spinner.dart'; import '../../../widget/firka_icon.dart'; @@ -55,7 +56,7 @@ bool _fetching = true; bool _prefetched = false; bool canPop = true; -class _HomeScreenState extends State { +class _HomeScreenState extends FirkaState { _HomeScreenState(); HomePage page = HomePage.home; diff --git a/firka/lib/ui/phone/screens/login/login_screen.dart b/firka/lib/ui/phone/screens/login/login_screen.dart index 2be7a65..bb3bb03 100644 --- a/firka/lib/ui/phone/screens/login/login_screen.dart +++ b/firka/lib/ui/phone/screens/login/login_screen.dart @@ -7,6 +7,7 @@ import 'package:firka/ui/phone/widgets/login_webview.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/image_preloader.dart'; import '../../../model/style.dart'; import '../../../widget/delayed_spinner.dart'; @@ -20,7 +21,7 @@ class LoginScreen extends StatefulWidget { State createState() => _LoginScreenState(); } -class _LoginScreenState extends State { +class _LoginScreenState extends FirkaState { late LoginWebviewWidget _loginWebView; bool _preloadDone = false; diff --git a/firka/lib/ui/phone/screens/settings/settings_screen.dart b/firka/lib/ui/phone/screens/settings/settings_screen.dart index cc2c3df..11eb66f 100644 --- a/firka/lib/ui/phone/screens/settings/settings_screen.dart +++ b/firka/lib/ui/phone/screens/settings/settings_screen.dart @@ -12,6 +12,7 @@ import 'package:flutter/services.dart'; import 'package:majesticons_flutter/majesticons_flutter.dart'; import '../../../../helpers/firka_bundle.dart'; +import '../../../../helpers/firka_state.dart'; import '../../../../helpers/settings/setting.dart'; class SettingsScreen extends StatefulWidget { @@ -24,7 +25,7 @@ class SettingsScreen extends StatefulWidget { State createState() => _SettingsScreenState(); } -class _SettingsScreenState extends State { +class _SettingsScreenState extends FirkaState { _SettingsScreenState(); bool settingAppIcon = false; diff --git a/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart b/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart index 874a0ac..5f07c21 100644 --- a/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart +++ b/firka/lib/ui/phone/screens/wear_login/wear_login_screen.dart @@ -8,6 +8,7 @@ import 'package:watch_connectivity/watch_connectivity.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../../../../helpers/api/token_grant.dart'; +import '../../../../helpers/firka_state.dart'; import '../home/home_screen.dart'; import '../login/login_screen.dart'; @@ -20,7 +21,7 @@ class WearLoginScreen extends StatefulWidget { State createState() => _WearLoginScreenState(); } -class _WearLoginScreenState extends State { +class _WearLoginScreenState extends FirkaState { late WebViewController _webViewController; _WearLoginScreenState(); diff --git a/firka/lib/ui/phone/widgets/login_webview.dart b/firka/lib/ui/phone/widgets/login_webview.dart index 8e35503..d5b9da3 100644 --- a/firka/lib/ui/phone/widgets/login_webview.dart +++ b/firka/lib/ui/phone/widgets/login_webview.dart @@ -7,6 +7,7 @@ import '../../../helpers/api/client/kreta_client.dart'; import '../../../helpers/api/consts.dart'; import '../../../helpers/api/token_grant.dart'; import '../../../helpers/db/models/token_model.dart'; +import '../../../helpers/firka_state.dart'; import '../screens/home/home_screen.dart'; class LoginWebviewWidget extends StatefulWidget { @@ -21,7 +22,7 @@ class LoginWebviewWidget extends StatefulWidget { State createState() => _LoginWebviewWidgetState(); } -class _LoginWebviewWidgetState extends State { +class _LoginWebviewWidgetState extends FirkaState { late WebViewController _webViewController; @override diff --git a/firka/lib/ui/widget/delayed_spinner.dart b/firka/lib/ui/widget/delayed_spinner.dart index 9eccfc9..5ae90c5 100644 --- a/firka/lib/ui/widget/delayed_spinner.dart +++ b/firka/lib/ui/widget/delayed_spinner.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import '../../helpers/firka_state.dart'; import '../model/style.dart'; class DelayedSpinnerWidget extends StatefulWidget { @@ -11,7 +12,7 @@ class DelayedSpinnerWidget extends StatefulWidget { State createState() => _DelayedSpinner(); } -class _DelayedSpinner extends State { +class _DelayedSpinner extends FirkaState { Timer? timer; bool showSpinner = false;