forked from firka/firka
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:
32
firka/lib/helpers/firka_state.dart
Normal file
32
firka/lib/helpers/firka_state.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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});
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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> {
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user