State -> FirkaState

Add a helper called FirkaState which registers
a listener to globalUpdate, so that we can
invalidate every widget that is active
This commit is contained in:
2025-09-09 13:13:55 +02:00
parent 869ba964ee
commit d1c34bd607
16 changed files with 72 additions and 22 deletions

View File

@@ -0,0 +1,32 @@
import 'package:firka/main.dart';
import 'package:flutter/widgets.dart';
abstract class FirkaState<T extends StatefulWidget> extends State<T> {
@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);
}
}

View File

@@ -256,6 +256,7 @@ void main() async {
}
final ValueNotifier<bool> isLightMode = ValueNotifier<bool>(true);
final UpdateNotifier globalUpdate = UpdateNotifier();
class InitializationScreen extends StatelessWidget {
InitializationScreen({super.key});

View File

@@ -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<HomeGradesScreen> {
class _HomeGradesScreen extends FirkaState<HomeGradesScreen> {
ApiResponse<List<Grade>>? grades;
ApiResponse<List<Lesson>>? week;
ApiResponse<List<ClassGroup>>? classGroups;

View File

@@ -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<StatefulWidget> createState() => _HomeGradesSubjectScreen();
}
class _HomeGradesSubjectScreen extends State<HomeGradesSubjectScreen> {
class _HomeGradesSubjectScreen extends FirkaState<HomeGradesSubjectScreen> {
Iterable<Grade>? grades;
@override

View File

@@ -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<HomeMainScreen> createState() => _HomeMainScreen();
}
class _HomeMainScreen extends State<HomeMainScreen> {
class _HomeMainScreen extends FirkaState<HomeMainScreen> {
_HomeMainScreen();
DateTime now = timeNow();

View File

@@ -1,21 +1,23 @@
import 'package:flutter/material.dart';
import '../../../../helpers/firka_state.dart';
class PageWithSubPages extends StatefulWidget {
final int pageIndex;
final List<Widget Function(void Function(int))> 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<PageWithSubPages> {
class _PageWithSubPagesState extends FirkaState<PageWithSubPages> {
int _currentSubPage = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: widget.subPages[_currentSubPage]((page) {
setState(() {
@@ -24,5 +26,4 @@ class _PageWithSubPagesState extends State<PageWithSubPages> {
}),
);
}
}
}

View File

@@ -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<HomeTimetableScreen> createState() => _HomeTimetableScreen();
}
class _HomeTimetableScreen extends State<HomeTimetableScreen> {
class _HomeTimetableScreen extends FirkaState<HomeTimetableScreen> {
List<Lesson>? lessons;
List<Lesson>? events;
List<Test>? tests;

View File

@@ -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<HomeTimetableMonthlyScreen> {
class _HomeTimetableMonthlyScreen
extends FirkaState<HomeTimetableMonthlyScreen> {
List<Lesson>? lessons;
List<Test>? tests;
List<DateTime>? dates;

View File

@@ -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<DebugScreen> createState() => _DebugScreen();
}
class _DebugScreen extends State<DebugScreen> {
class _DebugScreen extends FirkaState<DebugScreen> {
_DebugScreen();
late ImagePicker _picker;

View File

@@ -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<BetaScreen> createState() => _BetaScreenState();
}
class _BetaScreenState extends State<BetaScreen> {
class _BetaScreenState extends FirkaState<BetaScreen> {
late Timer timer;
int counter = 5;
@@ -85,7 +86,9 @@ class _BetaScreenState extends State<BetaScreen> {
),
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,

View File

@@ -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<HomeScreen> {
class _HomeScreenState extends FirkaState<HomeScreen> {
_HomeScreenState();
HomePage page = HomePage.home;

View File

@@ -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<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
class _LoginScreenState extends FirkaState<LoginScreen> {
late LoginWebviewWidget _loginWebView;
bool _preloadDone = false;

View File

@@ -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<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
class _SettingsScreenState extends FirkaState<SettingsScreen> {
_SettingsScreenState();
bool settingAppIcon = false;

View File

@@ -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<WearLoginScreen> createState() => _WearLoginScreenState();
}
class _WearLoginScreenState extends State<WearLoginScreen> {
class _WearLoginScreenState extends FirkaState<WearLoginScreen> {
late WebViewController _webViewController;
_WearLoginScreenState();

View File

@@ -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<LoginWebviewWidget> createState() => _LoginWebviewWidgetState();
}
class _LoginWebviewWidgetState extends State<LoginWebviewWidget> {
class _LoginWebviewWidgetState extends FirkaState<LoginWebviewWidget> {
late WebViewController _webViewController;
@override

View File

@@ -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<DelayedSpinnerWidget> createState() => _DelayedSpinner();
}
class _DelayedSpinner extends State<DelayedSpinnerWidget> {
class _DelayedSpinner extends FirkaState<DelayedSpinnerWidget> {
Timer? timer;
bool showSpinner = false;