iOS Human Interface Guidelines(HIG)和 Material Design 對導航行為有不同的慣例。跨平台 app(Flutter、React Native)需要決定:完全遵循一套、各平台遵循各自的慣例、或混合使用。這個決策影響使用者在不同平台上的操作體驗。

Back 行為

iOS

iOS 沒有系統級的 back 按鈕。導航列左上角的 back 按鈕由 app 提供(UINavigationController 自動加入)。使用者也可以從螢幕左邊緣向右滑動觸發 back(edge swipe gesture)。

iOS 的 back 行為是 pop — 彈出堆疊頂端,回到前一個畫面。沒有 Android 的系統 back 按鈕覆寫機制。

Android / Material Design

Android 有系統級的 back 按鈕(虛擬或實體)。Material Design 在 app bar 左上角也放 back 箭頭或 hamburger menu 圖示。

Android 的 back 行為由 app 控制(onBackPressed),可以被覆寫。常見的覆寫場景:在首頁按 back 詢問「是否離開 app」、在表單中按 back 詢問「是否放棄編輯」。

跨平台決策

Flutter 預設在 Android 上攔截系統 back 按鈕,在 iOS 上提供 back 按鈕和 edge swipe。GoRouter 的 pop() 在兩個平台上行為一致。

跨平台 app 需要注意的差異:iOS 使用者習慣 edge swipe back,Android 使用者習慣按系統 back 按鈕。兩者都要支援。

Tab bar 位置

iOS

Tab bar 固定在畫面底部。iOS 使用者期望 tab bar 永遠可見、永遠在底部。Apple 的 HIG 明確建議 tab bar 在底部。

Material Design

Material Design 的 bottom navigation 也在底部,但額外支援 top tabs(在 app bar 下方的可滑動標籤列)。Top tabs 適合同一類內容的不同視角(全部 / 未讀 / 已標記)。

跨平台決策

底部 tab bar 在兩個平台上都是標準做法。Top tabs 在 iOS 上較少見(iOS 偏好用 segmented control 代替 top tabs)。跨平台 app 用底部 tab bar 是最安全的選擇。

iOS

iOS 的 modal 畫面從底部滑上來,覆蓋前一個畫面但不完全遮擋(iOS 13+ 的 sheet 呈現樣式可以看到前一個畫面的上緣)。Dismiss 操作是向下滑動或點擊關閉按鈕。

Material Design

Material Design 的 bottom sheet 和 dialog 是 modal 的主要形式。Full-screen dialog 從底部滑上來,有 close 按鈕在左上角和 action 按鈕在右上角。

跨平台決策

Flutter 的 showModalBottomSheetshowDialog 在兩個平台上都可用。視覺呈現可以用 platform-adaptive widget(CupertinoPageRoute vs MaterialPageRoute)按平台切換。

選擇策略

策略適合場景代價
統一用 Material Design以 Android 為主的 app、快速開發iOS 使用者體驗不原生
統一用 iOS HIG以 iOS 為主的 appAndroid 使用者體驗不原生
各平台遵循各自慣例重視兩個平台原生體驗開發和測試成本翻倍
共用核心、差異點適配多數跨平台 app 的實際選擇需要判斷哪些差異值得適配

多數跨平台 app 選擇「共用核心、差異點適配」— 底部 tab bar、push/pop 導航在兩個平台上一致;back 手勢、modal 呈現按平台適配。

下一步路由