Skip to content

Commit 01e0510

Browse files
committed
fix: key courseTableProvider by semester ID to prevent unnecessary recreations
1 parent ec3a288 commit 01e0510

File tree

3 files changed

+19
-19
lines changed

3 files changed

+19
-19
lines changed

lib/repositories/course_repository.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -248,20 +248,18 @@ class CourseRepository {
248248
/// DB is updated.
249249
///
250250
/// Use [getCourseOffering] for related data (teachers, classrooms, schedules).
251-
Stream<CourseTableData> watchCourseTable({
252-
required Semester semester,
253-
}) async* {
251+
Stream<CourseTableData> watchCourseTable({required int semesterId}) async* {
254252
const ttl = Duration(days: 3);
255253

256254
final query = _database.select(_database.courseTableSlots)
257-
..where((s) => s.semester.equals(semester.id));
255+
..where((s) => s.semester.equals(semesterId));
258256

259257
await for (final rows in query.watch()) {
260258
final data = _buildCourseTableData(rows);
261259

262260
if (data.isEmpty) {
263261
try {
264-
await refreshCourseTable(semester: semester);
262+
await refreshCourseTable(semesterId: semesterId);
265263
} catch (_) {
266264
// Absorb: yield empty below so UI exits loading state
267265
}
@@ -271,14 +269,15 @@ class CourseRepository {
271269

272270
final semesterRow = await (_database.select(
273271
_database.semesters,
274-
)..where((s) => s.id.equals(semester.id))).getSingle();
272+
)..where((s) => s.id.equals(semesterId))).getSingle();
275273
final age = switch (semesterRow.courseTableFetchedAt) {
276274
final t? => DateTime.now().difference(t),
277275
null => ttl,
278276
};
277+
279278
if (age >= ttl) {
280279
try {
281-
await refreshCourseTable(semester: semester);
280+
await refreshCourseTable(semesterId: semesterId);
282281
} catch (_) {
283282
// Absorb: stale data is shown via stream
284283
}
@@ -290,10 +289,11 @@ class CourseRepository {
290289
///
291290
/// The [watchCourseTable] stream automatically emits the updated value.
292291
/// Network errors propagate to the caller.
293-
Future<void> refreshCourseTable({
294-
required Semester semester,
295-
}) async {
292+
Future<void> refreshCourseTable({required int semesterId}) async {
296293
final user = await _database.select(_database.users).getSingle();
294+
final semester = await (_database.select(
295+
_database.semesters,
296+
)..where((s) => s.id.equals(semesterId))).getSingle();
297297

298298
final dtos = await _authRepository.withAuth(
299299
() => _courseService.getCourseTable(

lib/screens/main/course_table/course_table_providers.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ final courseTableSemestersProvider = StreamProvider.autoDispose<List<Semester>>(
1616
///
1717
/// Watches the DB directly — automatically updates when course table data
1818
/// changes. Background-refreshes stale data automatically.
19+
///
20+
/// Keyed by [Semester.id] (not the full object) so that timestamp updates
21+
/// on the semester row don't recreate the provider.
1922
final courseTableProvider = StreamProvider.autoDispose
20-
.family<CourseTableData, Semester>((
21-
ref,
22-
semester,
23-
) {
23+
.family<CourseTableData, int>((ref, semesterId) {
2424
return ref
2525
.watch(courseRepositoryProvider)
26-
.watchCourseTable(semester: semester);
26+
.watchCourseTable(semesterId: semesterId);
2727
});

lib/screens/main/course_table/course_table_screen.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ class CourseTableScreen extends ConsumerWidget {
2424
Semester semester,
2525
) async {
2626
final courseRepository = ref.read(courseRepositoryProvider);
27-
await Future.wait([
27+
await [
2828
courseRepository.refreshSemesters(),
29-
courseRepository.refreshCourseTable(semester: semester),
30-
]);
29+
courseRepository.refreshCourseTable(semesterId: semester.id),
30+
].wait;
3131
}
3232

3333
void _showDemoTap(BuildContext context) {
@@ -164,7 +164,7 @@ class CourseTableScreen extends ConsumerWidget {
164164
Consumer(
165165
builder: (context, tabRef, child) {
166166
final courseTableAsync = tabRef.watch(
167-
courseTableProvider(semester),
167+
courseTableProvider(semester.id),
168168
);
169169

170170
return switch (courseTableAsync) {

0 commit comments

Comments
 (0)