那如果照片還是消失了呢?像是連 App 儲存空間都讀取不到?工程師就是這種被害妄想症的生物。現在主流的做法,是將資料的狀態包裝成 sealed class,用來呈現:成功、以及失敗的狀態。
外面使用該方法的人,只需要使用 when 語法,將成功以及失敗,分成兩種不同的路線處理即可。這樣做可讀性更好,而且權責分明。
像是取得照片的 LocalPhotoStore,open 方法就可以改造成上述的寫法。先來新增一個專門表達狀態的 sealed class:
sealed class PhotoReadResult {
data class Available(val bitmap: Bitmap) : PhotoReadResult()
class Unavailable : PhotoReadResult() // 👈🏼 或用 data object 也可以
}
這個 PhotoReadResult 表達兩種狀態,成功和失敗。成功的話直接置入 bitmap 丟到外面去。

從程式碼來看,如果啥都沒改,然後很變態的把 App 儲存空間下的照片移除,程式會 Crash(也就是直接閃退)。😇
這麼做之後安全很多,不會閃退了。有任何的錯誤會回傳 Unavailable。
顯示調整起來也很容易,先針對使用 LocalPhotoStore 使用 open 方法的地方來看看就好。如果正在用 IDE,也可以用 Command + B (Win/Linux: Ctrl + B) 跳過去。
目前只有 OwnedPhotoImage ComposeView 在用,可以完全聚焦在這個檔案即可。

用 When 判斷式,很漂亮的可以將成功以及失敗走兩套完全不同的流程。除了好閱讀,也好修改。
那 Unavailable 就給他一個超簡單的 Box 顯示錯誤訊息就好了。🤗
Box(
modifier = modifier.clipToBounds(),
contentAlignment = Alignment.Center
) {
Text(text = "照片暫時無法讀取")
}

就讓我很變態的把 App 儲存空間裡頭的照片刪掉,看看會變成什麼恐怖狀況。

優雅的顯示了錯誤訊息。