跳至主要內容

適應性應用程式的一般方法

那麼,究竟如何著手將為傳統行動裝置設計的應用程式,使其在各種裝置上都能呈現美觀的效果?需要哪些步驟?

曾為大型應用程式進行這項工作的 Google 工程師,建議採用以下 3 步驟方法。

步驟 1:抽象化

#

Step 1: Abstract info common to any UI widget

首先,找出您計畫使其動態化的 widget。分析這些 widget 的建構子,並將您可以共用的資料抽象化。

需要適應性的常見 widget 有:

  • 對話框,包括全螢幕和模式對話框
  • 導覽 UI,包括導覽側邊欄和底部導覽列
  • 自訂佈局,例如「UI 區域是較高還是較寬?」

例如,在 Dialog widget 中,您可以共用包含對話框內容的資訊。

或者,您可能希望在應用程式視窗較小時切換使用 NavigationBar,而在應用程式視窗較大時切換使用 NavigationRail。這些 widget 很可能會共用可導覽目的地的清單。在這種情況下,您可以建立一個 Destination widget 來保存此資訊,並指定 Destination 同時具有圖示和文字標籤。

接下來,您將評估螢幕大小,以決定如何顯示您的 UI。

步驟 2:測量

#

Step 2: How to measure screen size

您有兩種方法可以判斷顯示區域的大小:MediaQueryLayoutBuilder

MediaQuery

#

過去,您可能會使用 MediaQuery.of 來判斷裝置螢幕的大小。然而,今天的裝置螢幕尺寸和形狀種類繁多,這種測試可能會產生誤導。

例如,您的應用程式目前可能在大型螢幕上佔用一個小視窗。如果您使用 MediaQuery.of 方法並得出螢幕很小的結論(但事實上,該應用程式是在大螢幕上的小視窗中顯示),並且您已將您的應用程式鎖定為直向模式,則會導致該應用程式的視窗鎖定在螢幕中心,周圍都是黑色。這在大螢幕上絕非理想的 UI。

請記住,MediaQuery.sizeOf 會傳回應用程式整個螢幕的目前大小,而不僅僅是單一 widget 的大小。

您有兩種方法可以測量您的螢幕空間。您可以根據您想要整個應用程式視窗的大小,還是更區域性的大小,使用 MediaQuery.sizeOfLayoutBuilder

如果您希望您的 widget 為全螢幕,即使在應用程式視窗很小時也是如此,請使用 MediaQuery.sizeOf,以便您可以根據應用程式視窗本身的大小選擇 UI。在上一節中,您希望根據整個應用程式視窗來設定大小行為,因此您應該使用 MediaQuery.sizeOf

build 方法內部請求應用程式視窗的大小,如 MediaQuery.sizeOf(context),會導致在大小屬性變更時重新建置指定的 BuildContext

LayoutBuilder

#

LayoutBuilder 達到與 MediaQuery.sizeOf 類似的目標,但有一些區別。

LayoutBuilder 不會提供應用程式視窗的大小,而是提供來自父 Widget 的佈局約束。這表示您會根據您新增 LayoutBuilder 的 widget 樹狀結構中的特定位置取得大小資訊。此外,LayoutBuilder 會傳回 BoxConstraints 物件而不是 Size 物件,因此您會獲得內容的有效寬度和高度範圍(最小值和最大值),而不僅僅是固定大小。這對於自訂 widget 很有用。

例如,假設有一個自訂 widget,您希望其大小調整是以專門給予該 widget 的空間為基礎,而不是整個應用程式視窗。在這種情況下,請使用 LayoutBuilder

步驟 3:分歧

#

Step 3: Branch the code based on the desired UI

此時,您必須決定選擇顯示哪個版本的 UI 時要使用的大小斷點。例如,Material 佈局指南建議對於寬度小於 600 邏輯像素的視窗使用底部導覽列,而對於寬度為 600 像素或更大的視窗則使用導覽側邊欄。同樣地,您的選擇不應取決於裝置的類型,而應取決於裝置可用的視窗大小。

若要逐步執行在 NavigationRailNavigationBar 之間切換的範例,請查看使用 Material 3 建立動畫回應式應用程式佈局

下一頁將討論如何確保您的應用程式在大型螢幕和可摺疊裝置上呈現最佳外觀。