From 667a8e0e4dc94e6d7d40ec81a52c72077510e043 Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Sun, 26 Oct 2025 09:07:10 +0100 Subject: [PATCH] refactor: use streams for fetching data --- .../lib/helpers/api/client/kreta_stream.dart | 165 ++++++++++++ firka/lib/ui/phone/pages/home/home_main.dart | 143 ++++++---- .../ui/phone/pages/home/home_timetable.dart | 50 ++-- .../ui/phone/screens/home/home_screen.dart | 249 ++++++++---------- 4 files changed, 411 insertions(+), 196 deletions(-) create mode 100644 firka/lib/helpers/api/client/kreta_stream.dart diff --git a/firka/lib/helpers/api/client/kreta_stream.dart b/firka/lib/helpers/api/client/kreta_stream.dart new file mode 100644 index 0000000..8f871b5 --- /dev/null +++ b/firka/lib/helpers/api/client/kreta_stream.dart @@ -0,0 +1,165 @@ +import 'package:firka/helpers/api/model/class_group.dart'; +import 'package:firka/helpers/api/model/homework.dart'; +import 'package:firka/helpers/api/model/notice_board.dart'; +import 'package:firka/helpers/api/model/omission.dart'; +import 'package:firka/helpers/api/model/test.dart'; +import 'package:firka/helpers/api/model/timetable.dart'; + +import '../model/grade.dart'; +import '../model/student.dart'; +import 'kreta_client.dart'; + +bool getStudentFL = false; +bool getClassGroupsFL = false; +bool getNoticeBoardStreamFL = false; +bool getInfoBoardStreamFL = false; +bool getGradesStreamFL = false; +bool getSubjectAverageStreamFL = false; +bool getHomeworkStreamFL = false; +bool getTimeTableStreamFL = false; +bool getTestsStreamFL = false; +bool getOmissionsStreamFL = false; + +extension KretaStream on KretaClient { + Stream> getStudentStream( + {bool cacheOnly = true}) async* { + while (getStudentFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getStudentFL = true; + yield await getStudent(forceCache: true); + + if (!cacheOnly) { + yield await getStudent(forceCache: false); + } + getStudentFL = false; + } + + Stream>> getClassGroupsStream( + {bool cacheOnly = true}) async* { + while (getClassGroupsFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getClassGroupsFL = true; + yield await getClassGroups(forceCache: true); + + if (!cacheOnly) { + yield await getClassGroups(forceCache: false); + } + getClassGroupsFL = false; + } + + Stream>> getNoticeBoardStream( + {bool cacheOnly = true}) async* { + while (getNoticeBoardStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getNoticeBoardStreamFL = true; + yield await getNoticeBoard(forceCache: true); + + if (!cacheOnly) { + yield await getNoticeBoard(forceCache: false); + } + getNoticeBoardStreamFL = false; + } + + Stream>> getInfoBoardStream( + {bool cacheOnly = true}) async* { + while (getInfoBoardStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getInfoBoardStreamFL = true; + yield await getInfoBoard(forceCache: true); + + if (!cacheOnly) { + yield await getInfoBoard(forceCache: false); + } + getInfoBoardStreamFL = false; + } + + Stream>> getGradesStream( + {bool cacheOnly = true}) async* { + while (getGradesStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getGradesStreamFL = true; + yield await getGrades(forceCache: true); + + if (!cacheOnly) { + yield await getGrades(forceCache: false); + } + getGradesStreamFL = false; + } + + Stream>> getSubjectAverageStream( + ClassGroup classGroup, + {bool cacheOnly = true}) async* { + while (getSubjectAverageStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getSubjectAverageStreamFL = true; + yield await getSubjectAverage(classGroup, forceCache: true); + + if (!cacheOnly) { + yield await getSubjectAverage(classGroup, forceCache: false); + } + getSubjectAverageStreamFL = false; + } + + Stream>> getHomeworkStream( + {bool cacheOnly = true}) async* { + while (getHomeworkStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getHomeworkStreamFL = true; + yield await getHomework(forceCache: true); + + if (!cacheOnly) { + yield await getHomework(forceCache: false); + } + getHomeworkStreamFL = false; + } + + Stream>> getTimeTableStream( + DateTime from, DateTime to, + {bool cacheOnly = true}) async* { + while (getTimeTableStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getTimeTableStreamFL = true; + yield await getTimeTable(from, to, forceCache: true); + + if (!cacheOnly) { + yield await getTimeTable(from, to, forceCache: false); + } + getTimeTableStreamFL = false; + } + + Stream>> getTestsStream( + {bool cacheOnly = true}) async* { + while (getTestsStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getTestsStreamFL = true; + yield await getTests(forceCache: true); + + if (!cacheOnly) { + yield await getTests(forceCache: false); + } + getTestsStreamFL = false; + } + + Stream>> getOmissionsStream( + {bool cacheOnly = true}) async* { + while (getOmissionsStreamFL) { + await Future.delayed(Duration(milliseconds: 10)); + } + getOmissionsStreamFL = true; + yield await getOmissions(forceCache: true); + + if (!cacheOnly) { + yield await getOmissions(forceCache: false); + } + getOmissionsStreamFL = false; + } +} diff --git a/firka/lib/ui/phone/pages/home/home_main.dart b/firka/lib/ui/phone/pages/home/home_main.dart index b9c76fa..5ef8d34 100644 --- a/firka/lib/ui/phone/pages/home/home_main.dart +++ b/firka/lib/ui/phone/pages/home/home_main.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:firka/helpers/api/client/kreta_stream.dart'; import 'package:firka/helpers/api/model/grade.dart'; import 'package:firka/helpers/extensions.dart'; import 'package:firka/helpers/ui/common_bottom_sheets.dart'; @@ -62,53 +63,115 @@ class _HomeMainScreen extends FirkaState { } void updateListener() async { - final newData = await loadData(now, forceCache: false); + await fetchData(cacheOnly: false); - if (mounted) { - setState(() { - lessons = newData.$1; - noticeBoard = newData.$2; - infoBoard = newData.$3; - student = newData.$4; - }); - } widget.finishNotifier.update(); } - Future<(List, List, List, Student)> - loadData(DateTime now, {bool forceCache = true}) async { + Future fetchData({bool cacheOnly = true}) async { final midnight = now.getMidnight(); - final respTT = await widget.data.client.getTimeTable( - midnight, midnight.add(Duration(hours: 23, minutes: 59)), - forceCache: forceCache); + var lessonsFetched = 0; + var noticeBoardFetched = 0; + var infoBoardFetched = 0; + var studentFetched = 0; + var testsFetched = 0; + var gradesFetched = 0; + var homeworkFetched = 0; - final respNB = - await widget.data.client.getNoticeBoard(forceCache: forceCache); + widget.data.client + .getTimeTableStream( + midnight, midnight.add(Duration(hours: 23, minutes: 59)), + cacheOnly: cacheOnly) + .forEach((lessons) { + lessonsFetched++; - final respIB = - await widget.data.client.getInfoBoard(forceCache: forceCache); + if (mounted) { + setState(() { + this.lessons = lessons.response; + }); + } + }); - final respStudent = - await widget.data.client.getStudent(forceCache: forceCache); + widget.data.client + .getNoticeBoardStream(cacheOnly: cacheOnly) + .forEach((items) { + noticeBoardFetched++; - final testsResp = await widget.data.client.getTests(forceCache: forceCache); - tests = testsResp.response; + if (mounted) { + setState(() { + noticeBoard = items.response; + }); + } + }); - final gradesResp = - await widget.data.client.getGrades(forceCache: forceCache); - grades = gradesResp.response; + widget.data.client + .getInfoBoardStream(cacheOnly: cacheOnly) + .forEach((items) { + infoBoardFetched++; - final homeworkResp = - await widget.data.client.getHomework(forceCache: forceCache); - homework = homeworkResp.response; + if (mounted) { + setState(() { + infoBoard = items.response; + }); + } + }); - return Future.value(( - respTT.response!, - respNB.response!, - respIB.response!, - respStudent.response!, - )); + widget.data.client + .getStudentStream(cacheOnly: cacheOnly) + .forEach((student) { + studentFetched++; + + if (mounted) { + setState(() { + this.student = student.response; + }); + } + }); + + widget.data.client.getTestsStream(cacheOnly: cacheOnly).forEach((tests) { + testsFetched++; + + if (mounted) { + setState(() { + this.tests = tests.response; + }); + } + }); + + widget.data.client.getGradesStream(cacheOnly: cacheOnly).forEach((grades) { + gradesFetched++; + + if (mounted) { + setState(() { + this.grades = grades.response; + }); + } + }); + + widget.data.client + .getHomeworkStream(cacheOnly: cacheOnly) + .forEach((homework) { + homeworkFetched++; + + if (mounted) { + setState(() { + this.homework = homework.response; + }); + } + }); + + final r = cacheOnly ? 1 : 2; + + while (lessonsFetched < r || + noticeBoardFetched < r || + infoBoardFetched < r || + studentFetched < r || + testsFetched < r || + gradesFetched < r || + homeworkFetched < r) { + await Future.delayed(Duration(milliseconds: 50)); + } } @override @@ -121,16 +184,7 @@ class _HomeMainScreen extends FirkaState { if (!mounted) return; (() async { - final newData = await loadData(now); - - if (mounted) { - setState(() { - lessons = newData.$1; - noticeBoard = newData.$2; - infoBoard = newData.$3; - student = newData.$4; - }); - } + await fetchData(); })(); timer = Timer.periodic(Duration(seconds: 1), (timer) async { @@ -227,6 +281,7 @@ class _HomeMainScreen extends FirkaState { grades != null && noticeBoard != null && lessons != null && + homework != null && tests != null) { List<(Widget, DateTime)> noticeBoardWidgets = List.empty(growable: true); diff --git a/firka/lib/ui/phone/pages/home/home_timetable.dart b/firka/lib/ui/phone/pages/home/home_timetable.dart index dd2f6e3..4fe3f11 100644 --- a/firka/lib/ui/phone/pages/home/home_timetable.dart +++ b/firka/lib/ui/phone/pages/home/home_timetable.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:carousel_slider/carousel_slider.dart'; +import 'package:firka/helpers/api/client/kreta_client.dart'; +import 'package:firka/helpers/api/client/kreta_stream.dart'; import 'package:firka/helpers/api/model/test.dart'; import 'package:firka/helpers/api/model/timetable.dart'; import 'package:firka/helpers/debug_helper.dart'; @@ -144,13 +146,10 @@ class _HomeTimetableScreen extends FirkaState await widget.data.client.getTests(); } - Future initForWeek(DateTime now, {bool forceCache = true}) async { + Future _updateState(DateTime now, ApiResponse> lessonsResp, + ApiResponse> testsResp) async { var monday = now.getMonday().getMidnight(); - var sunday = monday.add(Duration(days: 6)); - var lessonsResp = await widget.data.client - .getTimeTable(monday, sunday, forceCache: forceCache); - var testsResp = await widget.data.client.getTests(forceCache: forceCache); List dates = List.empty(growable: true); if (lessonsResp.response != null) { @@ -193,6 +192,37 @@ class _HomeTimetableScreen extends FirkaState }); } + Future initForWeek(DateTime now, {bool forceCache = true}) async { + var monday = now.getMonday().getMidnight(); + var sunday = monday.add(Duration(days: 6)); + + ApiResponse>? lessonsResp; + var lessonsFetched = 0; + ApiResponse>? testsResp; + var testsFetched = 0; + + widget.data.client + .getTimeTableStream(monday, sunday, cacheOnly: forceCache) + .forEach((lessons) { + lessonsResp = lessons; + lessonsFetched++; + }); + + widget.data.client.getTestsStream(cacheOnly: forceCache).forEach((tests) { + testsResp = tests; + testsFetched++; + }); + + while (lessonsFetched < 1 || testsFetched < 1) { + await Future.delayed(Duration(milliseconds: 50)); + } + await _updateState(now, lessonsResp!, testsResp!); + while (lessonsFetched < 2 || testsFetched < 2) { + await Future.delayed(Duration(milliseconds: 50)); + } + await _updateState(now, lessonsResp!, testsResp!); + } + void updateListener() async { if (now != null) { await initForWeek(now!, forceCache: false); @@ -320,16 +350,6 @@ class _HomeTimetableScreen extends FirkaState final date = dates![i]; final realIndex = i; // Always use real index for nav icons - final lessonsOnDate = lessons! - .where((lesson) => - lesson.start.isAfter(date) && - lesson.end.isBefore(date.add(Duration(hours: 24)))) - .toList(); - final eventsOnDate = events! - .where((lesson) => - lesson.start.isAfter(date.subtract(Duration(seconds: 1))) && - lesson.end.isBefore(date.add(Duration(hours: 23, minutes: 59)))) - .toList(); final testsOnDate = tests! .where((test) => test.date.isAfter(date.subtract(Duration(seconds: 1))) && diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index d224ac5..e8da321 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -1,9 +1,8 @@ import 'dart:async'; import 'dart:io'; -import 'dart:math'; -import 'package:firka/helpers/api/client/kreta_client.dart'; -import 'package:firka/helpers/api/exceptions/token.dart'; +import 'package:firka/helpers/api/client/kreta_stream.dart'; +import 'package:firka/helpers/extensions.dart'; import 'package:firka/helpers/settings.dart'; import 'package:firka/helpers/update_notifier.dart'; import 'package:firka/main.dart'; @@ -15,7 +14,6 @@ import 'package:firka/ui/phone/pages/home/home_subpage.dart'; import 'package:firka/ui/phone/pages/home/home_timetable_mo.dart'; import 'package:firka/ui/phone/screens/home/beta_screen.dart'; import 'package:firka/ui/phone/widgets/bottom_nav_icon.dart'; -import 'package:firka/ui/phone/widgets/login_webview.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -43,7 +41,8 @@ class PageNavData { PageNavData(this.page, this.subPageParams, this.subjectName); } -final ValueNotifier pageNavNotifier = ValueNotifier(PageNavData(HomePage.home, null, "")); +final ValueNotifier pageNavNotifier = + ValueNotifier(PageNavData(HomePage.home, null, "")); bool forcedNavPage = false; // TODO: this is a hack! class HomeScreen extends StatefulWidget { @@ -83,7 +82,7 @@ class _HomeScreenState extends FirkaState { bool _preloadDone = false; int forcedNav = 0; final RefreshController _refreshController = - RefreshController(initialRefresh: false); + RefreshController(initialRefresh: false); ActiveToastType activeToast = ActiveToastType.none; @@ -101,84 +100,8 @@ class _HomeScreenState extends FirkaState { try { _prefetched = true; - var random = Random(); - ApiResponse res = - await widget.data.client.getStudent(forceCache: false); - if (res.statusCode >= 400 || - res.err == TokenExpiredException().toString()) { - if (_disposed) return; - setState(() { - activeToast = ActiveToastType.reauth; - toast = Positioned( - top: MediaQuery.of(context).size.height / 1.6, - left: 0.0, - right: 0.0, - bottom: 0, - child: Center( - child: GestureDetector( - child: Card( - color: appStyle.colors.warningCard, - shadowColor: Colors.transparent, - child: Padding( - padding: EdgeInsets.all(8), - child: Row( - mainAxisSize: MainAxisSize.min, - // Use min to prevent filling the width - children: [ - FirkaIconWidget(FirkaIconType.majesticons, - Majesticon.alertCircleSolid, - color: appStyle.colors.warningAccent, size: 24), - SizedBox(width: 4), - Text( - widget.data.l10n.reauth, - style: appStyle.fonts.B_16SB - .copyWith(color: appStyle.colors.warningText), - ) - ], - ), - ), - ), - onTap: () { - showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: (BuildContext context) { - return LoginWebviewWidget(widget.data, - username: - widget.data.client.model.studentId.toString(), - schoolId: widget.data.client.model.iss!); - }, - ); - }, - ), - ), - ); - }); - return; - } - - if (res.err != null) { - throw "await widget.data.client.getStudent\n${res.err!}"; - } - - res = await widget.data.client.getGrades(forceCache: false); - - if (res.err != null) { - throw "await widget.data.client.getGrades\n${res.err!}"; - } - - await Future.delayed(Duration(seconds: 1 + random.nextInt(2))); - - var now = timeNow(); - var start = now.subtract(Duration(days: now.weekday - 1)); - var end = start.add(Duration(days: 6)); - - res = - await widget.data.client.getTimeTable(start, end, forceCache: false); - if (res.err != null) { - throw "await widget.data.client.getTimeTable\n${res.err!}"; - } + await fetchData(); if (Platform.isAndroid) { await WidgetCacheHelper.updateWidgetCache(appStyle, widget.data.client); @@ -257,6 +180,60 @@ class _HomeScreenState extends FirkaState { } } + Future fetchData() async { + var lessonsFetched = 0; + var noticeBoardFetched = 0; + var infoBoardFetched = 0; + var studentFetched = 0; + var testsFetched = 0; + var gradesFetched = 0; + var homeworkFetched = 0; + + final midnight = timeNow().getMidnight(); + + widget.data.client + .getTimeTableStream( + midnight, midnight.add(Duration(hours: 23, minutes: 59)), + cacheOnly: false) + .forEach((lessons) { + lessonsFetched++; + }); + + widget.data.client.getNoticeBoardStream(cacheOnly: false).forEach((items) { + noticeBoardFetched++; + }); + + widget.data.client.getInfoBoardStream(cacheOnly: false).forEach((items) { + infoBoardFetched++; + }); + + widget.data.client.getStudentStream(cacheOnly: false).forEach((student) { + studentFetched++; + }); + + widget.data.client.getTestsStream(cacheOnly: false).forEach((tests) { + testsFetched++; + }); + + widget.data.client.getGradesStream(cacheOnly: false).forEach((grades) { + gradesFetched++; + }); + + widget.data.client.getHomeworkStream(cacheOnly: false).forEach((homework) { + homeworkFetched++; + }); + + while (lessonsFetched < 2 || + noticeBoardFetched < 2 || + infoBoardFetched < 2 || + studentFetched < 2 || + testsFetched < 2 || + gradesFetched < 2 || + homeworkFetched < 2) { + await Future.delayed(Duration(milliseconds: 50)); + } + } + @override void initState() { super.initState(); @@ -321,7 +298,7 @@ class _HomeScreenState extends FirkaState { Timer.run(() { Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => BetaScreen(widget.data)), - (route) => false, + (route) => false, ); }); @@ -488,17 +465,19 @@ class _HomeScreenState extends FirkaState { // Home Button BottomNavIconWidget(() { if (homeScreenPage != HomePage.home) { - if (previousPages.length > 1 && forcedNavPage) { + if (previousPages.length > 1 && + forcedNavPage) { forcedNavPage = false; - _pageController.jumpToPage( - previousPages[previousPages.length - 2].index - ); + _pageController.jumpToPage(previousPages[ + previousPages.length - 2] + .index); } - if (previousPages.length > 1 && forcedNavPage) { + if (previousPages.length > 1 && + forcedNavPage) { forcedNavPage = false; - _pageController.jumpToPage( - previousPages[previousPages.length - 2].index - ); + _pageController.jumpToPage(previousPages[ + previousPages.length - 2] + .index); } _pageController.animateToPage( HomePage.home.index, @@ -519,11 +498,12 @@ class _HomeScreenState extends FirkaState { // Grades Button BottomNavIconWidget(() { if (homeScreenPage != HomePage.grades) { - if (previousPages.length > 1 && forcedNavPage) { + if (previousPages.length > 1 && + forcedNavPage) { forcedNavPage = false; - _pageController.jumpToPage( - previousPages[previousPages.length - 2].index - ); + _pageController.jumpToPage(previousPages[ + previousPages.length - 2] + .index); } _pageController.animateToPage( HomePage.grades.index, @@ -544,11 +524,12 @@ class _HomeScreenState extends FirkaState { // Timetable Button BottomNavIconWidget(() { if (homeScreenPage != HomePage.timetable) { - if (previousPages.length > 1 && forcedNavPage) { + if (previousPages.length > 1 && + forcedNavPage) { forcedNavPage = false; - _pageController.jumpToPage( - previousPages[previousPages.length - 2].index - ); + _pageController.jumpToPage(previousPages[ + previousPages.length - 2] + .index); } _pageController.animateToPage( HomePage.timetable.index, @@ -568,7 +549,7 @@ class _HomeScreenState extends FirkaState { appStyle.colors.textPrimary), // More Button BottomNavIconWidget( - () { + () { HapticFeedback.lightImpact(); showExtrasBottomSheet(context, widget.data); }, @@ -580,7 +561,7 @@ class _HomeScreenState extends FirkaState { appStyle.colors.secondary, appStyle.colors.textPrimary, isProfilePicture: - widget.data.profilePicture != null, + widget.data.profilePicture != null, ), ], ), @@ -600,7 +581,8 @@ class _HomeScreenState extends FirkaState { return; } - if (previousPages.isNotEmpty && homeScreenPage != previousPages.last) { + if (previousPages.isNotEmpty && + homeScreenPage != previousPages.last) { setState(() { homeScreenPage = previousPages.removeLast(); @@ -651,7 +633,6 @@ class HomeSubPage extends StatefulWidget { } class _HomeSubPage extends State { - HomePage? forcedHomePage; String? subPageData; @@ -668,20 +649,21 @@ class _HomeSubPage extends State { if (subPageData == null) { switch (p) { case HomePage.home: - return HomeMainScreen(widget.data, widget._updateNotifier, widget._updateFinishNotifier); + return HomeMainScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier); case HomePage.grades: return PageWithSubPages([ - (cb) => HomeGradesScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb), - (cb) => HomeGradesSubjectScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier) + (cb) => HomeGradesScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier, cb), + (cb) => HomeGradesSubjectScreen(widget.data, + widget._updateNotifier, widget._updateFinishNotifier) ], subPageActive, subPageBack, pageIndex: 0); case HomePage.timetable: return PageWithSubPages([ - (cb) => HomeTimetableScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb), - (cb) => HomeTimetableMonthlyScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb) + (cb) => HomeTimetableScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier, cb), + (cb) => HomeTimetableMonthlyScreen(widget.data, + widget._updateNotifier, widget._updateFinishNotifier, cb) ], subPageActive, subPageBack, pageIndex: 0); } } else { @@ -692,25 +674,17 @@ class _HomeSubPage extends State { case HomePage.grades: activeSubjectUid = subPageData!; return PageWithSubPages([ - (cb) => - HomeGradesSubjectScreen( - widget.data, widget._updateNotifier, - widget._updateFinishNotifier), - (cb) => - HomeGradesScreen( - widget.data, widget._updateNotifier, - widget._updateFinishNotifier, cb) + (cb) => HomeGradesSubjectScreen(widget.data, + widget._updateNotifier, widget._updateFinishNotifier), + (cb) => HomeGradesScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier, cb) ], subPageActive, subPageBack, pageIndex: 0); case HomePage.timetable: return PageWithSubPages([ - (cb) => - HomeTimetableMonthlyScreen( - widget.data, widget._updateNotifier, - widget._updateFinishNotifier, cb), - (cb) => - HomeTimetableScreen( - widget.data, widget._updateNotifier, - widget._updateFinishNotifier, cb) + (cb) => HomeTimetableMonthlyScreen(widget.data, + widget._updateNotifier, widget._updateFinishNotifier, cb), + (cb) => HomeTimetableScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier, cb) ], subPageActive, subPageBack, pageIndex: 0); } } @@ -718,20 +692,21 @@ class _HomeSubPage extends State { switch (widget.page) { case HomePage.home: - return HomeMainScreen(widget.data, widget._updateNotifier, widget._updateFinishNotifier); + return HomeMainScreen( + widget.data, widget._updateNotifier, widget._updateFinishNotifier); case HomePage.grades: return PageWithSubPages([ - (cb) => HomeGradesScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb), - (cb) => HomeGradesSubjectScreen( + (cb) => HomeGradesScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier, cb), + (cb) => HomeGradesSubjectScreen( widget.data, widget._updateNotifier, widget._updateFinishNotifier) ], subPageActive, subPageBack, pageIndex: 0); case HomePage.timetable: return PageWithSubPages([ - (cb) => HomeTimetableScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb), - (cb) => HomeTimetableMonthlyScreen( - widget.data, widget._updateNotifier, widget._updateFinishNotifier, cb) + (cb) => HomeTimetableScreen(widget.data, widget._updateNotifier, + widget._updateFinishNotifier, cb), + (cb) => HomeTimetableMonthlyScreen(widget.data, + widget._updateNotifier, widget._updateFinishNotifier, cb) ], subPageActive, subPageBack, pageIndex: 0); } }