當網路不可及時,處理 DioException 錯誤
背景
當網路請求發生錯誤時,套件會拋出 DioException 。
先前因為還沒討論好相對應的 UX 設計,所以暫時沒有處理。目前的情況是這個錯誤會一路被拋到最外層,被 Firebase Crashlytics 或是錯誤提示對話框(Debug mode) 接起來。
理想行為
應該有個統一的 DioException 處理方式,當 repo layer 嘗試更新但是網路不可及時,應維持顯示目前的快取內容並且透過 ScaffoldMessanger 顯示「網路更新錯誤,顯示快取內容」等提示。
建議實作方向 (AI Generated)
-
新增共用 DioException 判斷工具,例如 isNetworkUnavailable(error),集中判斷 connectionError、timeout、SocketException 等網路不可及情境。
-
Repository 維持目前快取優先策略:watchX() 背景更新失敗時不讓 stream 進入 error state,繼續顯示 Drift 快取資料。
-
UI 的 pull-to-refresh 統一包一層 helper,例如 runRefreshWithCachedFallback(),捕捉網路型 DioException 後顯示 SnackBar:「網路更新錯誤,顯示快取內容」。
-
不建議 repository 直接呼叫 ScaffoldMessenger。若背景自動更新也要提示,應透過 callback / UI event provider / repository event bus 通知 UI,由畫面或 root shell 顯示 SnackBar。
-
i18n 新增共用字串,例如 errors.networkRefreshFailedUsingCache,中英各一份,避免各畫面硬編訊息。
-
Crashlytics 應忽略預期中的網路不可及錯誤,只記錄非預期錯誤或解析/資料不一致問題,避免把離線情境當 crash noise。
-
優先落地範圍:先處理 CourseTableScreen、ProfileScreen 等已有 RefreshIndicator 的手動刷新;背景自動刷新提示可作第二階段。
當網路不可及時,處理 DioException 錯誤
背景
當網路請求發生錯誤時,套件會拋出 DioException 。
先前因為還沒討論好相對應的 UX 設計,所以暫時沒有處理。目前的情況是這個錯誤會一路被拋到最外層,被 Firebase Crashlytics 或是錯誤提示對話框(Debug mode) 接起來。
理想行為
應該有個統一的 DioException 處理方式,當 repo layer 嘗試更新但是網路不可及時,應維持顯示目前的快取內容並且透過 ScaffoldMessanger 顯示「網路更新錯誤,顯示快取內容」等提示。
建議實作方向 (AI Generated)
新增共用
DioException判斷工具,例如isNetworkUnavailable(error),集中判斷connectionError、timeout、SocketException等網路不可及情境。Repository 維持目前快取優先策略:
watchX()背景更新失敗時不讓 stream 進入 error state,繼續顯示 Drift 快取資料。UI 的 pull-to-refresh 統一包一層 helper,例如
runRefreshWithCachedFallback(),捕捉網路型DioException後顯示 SnackBar:「網路更新錯誤,顯示快取內容」。不建議 repository 直接呼叫
ScaffoldMessenger。若背景自動更新也要提示,應透過 callback / UI event provider / repository event bus 通知 UI,由畫面或 root shell 顯示 SnackBar。i18n 新增共用字串,例如
errors.networkRefreshFailedUsingCache,中英各一份,避免各畫面硬編訊息。Crashlytics 應忽略預期中的網路不可及錯誤,只記錄非預期錯誤或解析/資料不一致問題,避免把離線情境當 crash noise。
優先落地範圍:先處理
CourseTableScreen、ProfileScreen等已有RefreshIndicator的手動刷新;背景自動刷新提示可作第二階段。