@@ -2,28 +2,27 @@ import 'dart:async';
22
33import 'package:duty_it/app/api_client.dart' ;
44import 'package:duty_it/app/core/enums/event_sorting_type.dart' ;
5+ import 'package:duty_it/app/core/enums/event_type.dart' ;
6+ import 'package:duty_it/app/core/models/event.dart' ;
57import 'package:duty_it/app/core/models/events_response.dart' ;
6- import 'package:duty_it/app/modules/home/cache/home_view_cache.dart' ;
7- import 'package:duty_it/app/modules/notifications/models/app_notification.dart' ;
8- import 'package:duty_it/app/services/auth/auth_service.dart' ;
9- import 'package:duty_it/app/services/event/events/event_bookmark_event.dart' ;
108import 'package:duty_it/app/core/utils/app_utils.dart' ;
11- import 'package:duty_it/app/core/models/event.dart' ;
12- import 'package:duty_it/app/core/enums/event_type.dart' ;
9+ import 'package:duty_it/app/modules/home/cache/home_view_cache.dart' ;
1310import 'package:duty_it/app/modules/home/widgets/event_card.dart' ;
1411import 'package:duty_it/app/modules/home/widgets/modal/bookmark_bottom_modal.dart' ;
1512import 'package:duty_it/app/modules/home/widgets/modal/sorting_bottom_modal.dart' ;
13+ import 'package:duty_it/app/modules/notifications/models/app_notification.dart' ;
1614import 'package:duty_it/app/routes/app_pages.dart' ;
17- import 'package:duty_it/app/services/event/app_event_service.dart' ;
1815import 'package:duty_it/app/services/app_settings_service.dart' ;
16+ import 'package:duty_it/app/services/auth/auth_service.dart' ;
17+ import 'package:duty_it/app/services/event/app_event_service.dart' ;
18+ import 'package:duty_it/app/services/event/events/event_bookmark_event.dart' ;
1919import 'package:duty_it/app/services/search_filter/search_filter_service.dart' ;
2020import 'package:firebase_analytics/firebase_analytics.dart' ;
2121import 'package:firebase_crashlytics/firebase_crashlytics.dart' ;
2222import 'package:flutter/foundation.dart' ;
2323import 'package:flutter/material.dart' ;
2424import 'package:flutter/services.dart' ;
2525import 'package:get/get.dart' ;
26- import 'package:get_storage/get_storage.dart' ;
2726import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart' ;
2827import 'package:synchronized/synchronized.dart' ;
2928
@@ -33,12 +32,16 @@ class HomeViewController extends GetxController {
3332 final HomeViewCache _cache = HomeViewCache ();
3433 final FirebaseAnalytics analytics = FirebaseAnalytics .instance;
3534 final ScrollController scrollController = ScrollController ();
35+ final GlobalKey <RefreshIndicatorState > refreshIndicatorKey =
36+ GlobalKey <RefreshIndicatorState >();
37+
38+ bool loadEventListFromCache = true ;
3639
3740 AppSettingsService get _settingsService => Get .find <AppSettingsService >();
3841 AppEventService get _eventService => Get .find <AppEventService >();
3942
4043 final Rx <PagingState <String ?, EventCard >> _pagingState =
41- PagingState <String ?, EventCard >().obs;
44+ PagingState <String ?, EventCard >(isLoading : true ).obs;
4245 PagingState <String ?, EventCard > get pagingState => _pagingState.value;
4346 set pagingState (state) => _pagingState.value = state;
4447
@@ -98,7 +101,9 @@ class HomeViewController extends GetxController {
98101 );
99102
100103 checkNewNotification ();
101- fetchNextPage (clearPage: true , loadCache: true );
104+ WidgetsBinding .instance.addPostFrameCallback ((_) {
105+ refreshIndicatorKey.currentState? .show ();
106+ });
102107 }
103108
104109 Future <void > checkNewNotification () async {
@@ -132,21 +137,17 @@ class HomeViewController extends GetxController {
132137 );
133138 }
134139
135- Future <void > fetchNextPage ({
136- bool clearPage = false ,
137- bool loadCache = false ,
138- }) async {
140+ Future <void > fetchNextPage ({bool clearPage = false }) async {
139141 if (! clearPage && pagingState.isLoading) return ;
140142 await _pageFetchLock.synchronized (
141- () async =>
142- await _fetchNextPage (clearPage: clearPage, loadCache: loadCache),
143+ () async => await _fetchNextPage (clearPage: clearPage),
143144 );
144145 }
145146
146- Future <void > _fetchNextPage ({
147- bool clearPage = false ,
148- bool loadCache = false ,
149- }) async {
147+ Future <void > _fetchNextPage ({bool clearPage = false }) async {
148+ final loadCache = loadEventListFromCache;
149+ loadEventListFromCache = false ;
150+
150151 SearchFilterService sfService = Get .find <SearchFilterService >();
151152
152153 // Update paging state
@@ -207,6 +208,7 @@ class HomeViewController extends GetxController {
207208 name: 'fetch_events_page' ,
208209 parameters: {'clear_page' : "$clearPage " },
209210 );
211+ bool hasError = false ;
210212 try {
211213 var apiClient = Get .find <ApiClient >();
212214 var reqResult = await apiClient.getEvents (
@@ -255,14 +257,27 @@ class HomeViewController extends GetxController {
255257 _cache.saveEvents (response);
256258 }
257259 } else {
258- var fail = reqResult as RequestFail ;
260+ hasError = true ;
259261 if (kDebugMode) {
260262 AppUtils .showSnackBar (
261- '이벤트 목록을 불러오지 못했습니다: ${fail .serverFail ?.message ?? "" }' ,
263+ '이벤트 목록을 불러오지 못했습니다: ${( reqResult as RequestFail ) .serverFail ?.message ?? "" }' ,
262264 );
263265 }
264266 }
267+ } catch (ex, st) {
268+ hasError = true ;
269+ if (kDebugMode) {
270+ print (ex.toString () + st.toString ());
271+ }
272+ FirebaseCrashlytics .instance.recordError (ex, st);
265273 } finally {
274+ if (hasError) {
275+ pagingState = pagingState.copyWith (
276+ keys: clearPage ? [] : Omit (),
277+ pages: clearPage ? [] : Omit (),
278+ error: true ,
279+ );
280+ }
266281 pagingState = pagingState.copyWith (isLoading: false );
267282 }
268283 }
0 commit comments