畫面狀態矩陣是一張表格,每行代表一個畫面的一個狀態,每列描述該狀態的四個面向:顯示了什麼、使用者能做什麼操作、什麼條件進入這個狀態、怎麼離開。這張表格的目的是在實作前暴露導航缺口 — 退出路徑欄位為空代表使用者一旦進入就出不去。

四欄定義

顯示

使用者看到的畫面元素。進度指示器、錯誤訊息、表單欄位、資料列表 — 任何視覺上呈現的內容。

可用操作

使用者在這個狀態下能執行的動作。按鈕、手勢、鍵盤輸入、下拉選單選擇。重點是「能做什麼」,不是「看到什麼」。

「顯示」和「可用操作」的區別在於互動性。顯示一段錯誤訊息和顯示一個重試按鈕都是「顯示」;按下重試按鈕觸發重新連線是「可用操作」。

進入條件

什麼事件或動作讓畫面進入這個狀態。使用者操作(點擊按鈕)、系統事件(連線成功)、外部事件(推播通知)。

退出路徑

使用者如何離開這個狀態。返回上一頁、導航到另一個畫面、取消當前操作、完成流程後自動轉場。

退出路徑是這張表格中最容易遺漏的欄位。開發者設計畫面時,注意力集中在「進來後看到什麼、能做什麼」,容易忽略「怎麼離開」。

填寫步驟

第一步:列出畫面的所有狀態

從程式碼中的狀態管理機制取得狀態清單。Flutter 的 enum、React 的 state、Vue 的 reactive data — 任何控制畫面呈現的狀態變數。

如果沒有明確的狀態 enum,從畫面的視覺變化反推:loading 時長什麼樣、成功時長什麼樣、失敗時長什麼樣。每種不同的視覺呈現就是一個狀態。

第二步:每個狀態填四欄

逐一填寫每個狀態的顯示、可用操作、進入條件、退出路徑。填不出來的欄位先留空,留空本身就是發現。

第三步:檢查退出路徑欄

退出路徑為空的狀態是 UX 死胡同。使用者進入後無法靠自己的操作離開,只能殺掉 app 或等系統逾時。

app_tunnel 的 Terminal 畫面有五個 enum 狀態(idle / connecting / connected / error / disconnected),每個狀態的退出路徑都是空的。使用者從首頁點 Connect Terminal 進入後,無論處於哪個狀態都無法返回首頁(U.C1)。10 分鐘填完這張表格就能發現全部五個缺口(本章合成,UF-3 Derive)。

第四步:檢查操作欄

操作欄為空的狀態可能合理(loading 時使用者等待),也可能代表缺少互動設計。loading 狀態通常應該有「取消」操作,error 狀態通常應該有「重試」和「返回」。

填寫範例

以 app_tunnel Terminal 畫面為例,修復前的矩陣如下:

狀態顯示可用操作進入條件退出路徑
idle空白(自動連線)進入畫面
connecting進度指示idle 自動觸發
connected終端機 + 工具列打字、特殊鍵WebSocket 連線成功
error錯誤訊息 + 重連按鈕重新連線連線失敗
disconnected「連線中斷」+ 重連按鈕重新連線連線斷開

退出路徑欄全空 — 五個 UX 死胡同。修復後的矩陣應該每個狀態都有至少一條退出路徑:

狀態顯示可用操作進入條件退出路徑
idle空白(自動連線)取消進入畫面取消 → 返回首頁
connecting進度指示 + back 按鈕取消連線idle 自動觸發back → 返回首頁
connected終端機 + 工具列 + back打字、特殊鍵、中斷連線WebSocket 連線成功back / disconnect → 首頁
error錯誤訊息 + 重連 + back重新連線、返回連線失敗back → 返回首頁
disconnected中斷訊息 + 重連 + back重新連線、返回連線斷開back → 返回首頁

每個狀態至少一條退出路徑

退出路徑是預設要求。即使是 connecting 這種過渡狀態,使用者也應該能取消 — 連線卡住時使用者需要能離開。iOS HIG 和 Material Design 對 modal 畫面都要求 dismiss 機制;畫面狀態矩陣的退出路徑欄是這個要求的具體檢查方式。

退出路徑為空只在一種情況下合理:該狀態持續時間極短(< 1 秒)且有保證的自動轉場。即使如此,仍建議保留取消操作 — 因為「極短」是在正常情況下的預期,異常情況(網路中斷、服務當機)可能讓這個狀態停留很久。

下一步路由