美景、景觀和 ViewRefs
景觀
UI 用戶端希望追溯使用者可見的內容,必須將其置於該用戶端本機的「景觀檢視畫面」中,這是一種以工作階段為基礎的資源。任何資源都不能直接參照在自身的景觀工作階段範圍之外。
ViewRef 代表景觀
針對檢視區塊資源,特別適合擁有穩定且一致的檢視畫面參照,可用於各個元件邊界。
我們定義了 fuchsia.ui.views.ViewRef FIDL 資料類型,其中包含一些需要的屬性:
- ViewRef 在整個作業系統中具有全域唯一性,因此無法強化。這個屬性來自 ViewRef 的基礎核心物件 (即 eventpair)。
- ViewRef 在作業系統的生命週期內具有全域唯一性,永遠不會重複使用。這個屬性來自 Zircon 保證核心物件的 KOID 唯一性。
- ViewRef 可用於建立場景檢視畫面的前饋送模式。參與 View 建立程序的通訊協定和元件不需要「透過通道返回」對應的 ViewRef。
- ViewRef 容器可監聽基礎事件配對物件上的
ZX_EVENTPAIR_PEER_CLOSED
Zircon 信號,藉此實作生命週期管理。
每個景觀檢視畫面都有相關聯的 ViewRef。
查看樹狀結構
全域場景圖可以視為 View 的樹狀結構,每個圖表都包含 UI 內容,以及嵌入其他檢視畫面。由於每個 View 都有 ViewRef,因此也可以將檢視區塊樹狀結構視為 ViewRefs 的樹狀結構。
在檢視區塊樹狀結構中,父項檢視畫面對子項檢視畫面有極大效用:重新調整子項檢視畫面的位置、在子項檢視畫面強制執行裁剪界線,以及隱藏子項的 UI 內容等。由於檢視區塊階層本身俱有強大優勢,我們將以檢視區塊階層之外的方式做為基礎。這個階層會根據聚焦檢視畫面動態變更內容,以「聚焦鏈」表示。
ViewRef 的使用方式
一般來說,UI 用戶端會使用 ViewRef 來自行識別管理員類型的程式。
因為檢視畫面建立時是前饋類,因此管理員程式可在 View 建立 View 之前,開始處理 View 專用的邏輯。
以下是一些使用範例。Accessibility Manager 使用 ViewRefs 來識別及管理用戶端內容;IME 管理工具會使用 ViewRefs 來識別輸入法編輯器用戶端,Shortcuts Manager 會使用 ViewRefs 識別和管理用戶端撰寫的鍵盤快速鍵,Sys UI 則使用 ViewRefs 識別及管理子項檢視畫面的焦點。
ViewRef 和 ViewToken 也是如此嗎?
不會。這些 FIDL 資料類型都是由事件配對提供支援,但用途不同。
ViewToken 會由 View 內部使用。它會將 View 資源連結至場景圖表中對應的 ViewHolder 資源。語意會正常運作,因為事件組合的每一側都會分別由 View (子項) 和 ViewHolder (父項) 保留。
ViewRef 會在風景區外使用。UI 用戶端和管理員元件會將其用於參照檢視畫面。
ViewRef 不適用於驗證
ViewRef 可以輕鬆跨通訊協定邊界傳播。因此,請務必「不要」使用 ViewRef 做為驗證機制:只保留 ViewRef 就不應授予持有物件的能力。請改用功能轉送,以安全的方式將 ViewRef 消耗的通訊協定發布至受信任的元件。
例如 fuchsia.ui.views.ViewRefInstalled 通訊協定,可讓用戶端判斷 View 何時已在檢視表樹狀結構中安裝 ViewRef。
ViewRef 設計方面的取捨
前饋模式並不安全;用戶端在將 ViewRef 和 ViewRefControl 組合傳送至 View 時,會受信任不會建立 ViewRefControl 的密鑰副本。