PreferenceKey
Last updated
Was this helpful?
Last updated
Was this helpful?
The PreferenceKey protocol enables a way to send data up the view hierarchy. SwiftOnTap
當一開始佈局時 (layout),就要子視件回報一些資料給母視件才能順利完成佈局的話,就可以考慮使用 PreferenceKey。
設 K 為遵循 PreferenceKey 的真實型別 (concrete type),則使用這個 PreferenceKey 時,通常必須具備以下「三大要素」:
K 本身:負責定義如何「處理子視件回報的值」
母視件的 @State 變數:通常型別與 K.Value 相同,負責「更新子視件的佈局」。
子視件的 @Binding 變數:負責「承接來自母視件的更新通知」。
有了這些要素後,還要依照固定的模式,才能順利完成佈局,主要是以下的「三步驟」:
由子視件回報值給 K:用 child.preference(key:value:) 回報
由 K 負責處理回報的值:用 K.reduce(value:nextValue) 處理
由母視件根據回報的值,更新自己的 @State:用 parent.onPreferenceChange(_:perform:) 處理
整個流程可以簡化為:
子視件回報 ➜ PreferenceKey 處理 ➜ 母視件更新
👉 比較:Anchor Preferences
PreferenceKey 的名字最好是跟母視件的 @State 變數一致,例如: 如果我們要找的是某個子視件兩邊長中的最大邊,這時可以:
將母視件的 @State 變數取名為: maxSide
而 PreferenceKey 就取名為: MaxSide
👉 參見:
💈 CircleText
👉 自製型別:📦 PreferenceKeys