1
0
forked from firka/firka

refactor: use streams for fetching data

This commit is contained in:
2025-10-26 09:07:10 +01:00
parent 147dff3696
commit 667a8e0e4d
4 changed files with 411 additions and 196 deletions

View File

@@ -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<ApiResponse<Student>> 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<ApiResponse<List<ClassGroup>>> 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<ApiResponse<List<NoticeBoardItem>>> 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<ApiResponse<List<InfoBoardItem>>> 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<ApiResponse<List<Grade>>> 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<ApiResponse<List<SubjectAverage>>> 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<ApiResponse<List<Homework>>> 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<ApiResponse<List<Lesson>>> 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<ApiResponse<List<Test>>> 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<ApiResponse<List<Omission>>> 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;
}
}

View File

@@ -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<HomeMainScreen> {
}
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<Lesson>, List<NoticeBoardItem>, List<InfoBoardItem>, Student)>
loadData(DateTime now, {bool forceCache = true}) async {
Future<void> 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<HomeMainScreen> {
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<HomeMainScreen> {
grades != null &&
noticeBoard != null &&
lessons != null &&
homework != null &&
tests != null) {
List<(Widget, DateTime)> noticeBoardWidgets = List.empty(growable: true);

View File

@@ -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<HomeTimetableScreen>
await widget.data.client.getTests();
}
Future<void> initForWeek(DateTime now, {bool forceCache = true}) async {
Future<void> _updateState(DateTime now, ApiResponse<List<Lesson>> lessonsResp,
ApiResponse<List<Test>> 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<DateTime> dates = List.empty(growable: true);
if (lessonsResp.response != null) {
@@ -193,6 +192,37 @@ class _HomeTimetableScreen extends FirkaState<HomeTimetableScreen>
});
}
Future<void> initForWeek(DateTime now, {bool forceCache = true}) async {
var monday = now.getMonday().getMidnight();
var sunday = monday.add(Duration(days: 6));
ApiResponse<List<Lesson>>? lessonsResp;
var lessonsFetched = 0;
ApiResponse<List<Test>>? 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<HomeTimetableScreen>
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))) &&

View File

@@ -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<PageNavData> pageNavNotifier = ValueNotifier(PageNavData(HomePage.home, null, ""));
final ValueNotifier<PageNavData> 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<HomeScreen> {
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<HomeScreen> {
try {
_prefetched = true;
var random = Random();
ApiResponse<Object> 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<void>(
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<HomeScreen> {
}
}
Future<void> 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<HomeScreen> {
Timer.run(() {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => BetaScreen(widget.data)),
(route) => false,
(route) => false,
);
});
@@ -488,17 +465,19 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
// 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<HomeScreen> {
// 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<HomeScreen> {
// 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<HomeScreen> {
appStyle.colors.textPrimary),
// More Button
BottomNavIconWidget(
() {
() {
HapticFeedback.lightImpact();
showExtrasBottomSheet(context, widget.data);
},
@@ -580,7 +561,7 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
appStyle.colors.secondary,
appStyle.colors.textPrimary,
isProfilePicture:
widget.data.profilePicture != null,
widget.data.profilePicture != null,
),
],
),
@@ -600,7 +581,8 @@ class _HomeScreenState extends FirkaState<HomeScreen> {
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<HomeSubPage> {
HomePage? forcedHomePage;
String? subPageData;
@@ -668,20 +649,21 @@ class _HomeSubPage extends State<HomeSubPage> {
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<HomeSubPage> {
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<HomeSubPage> {
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);
}
}