extension View { public func preference( key: WritableKeyPath, value: V ) -> some View { PreferenceModifier(self) { preferences, _ in var preferences = preferences preferences[keyPath: key] = value return preferences } } } struct PreferenceModifier: View { var body: TupleView1 var modification: (PreferenceValues, EnvironmentValues) -> PreferenceValues init( _ child: Child, modification: @escaping (PreferenceValues, EnvironmentValues) -> PreferenceValues ) { self.body = TupleView1(child) self.modification = modification } func computeLayout( _ widget: Backend.Widget, children: any ViewGraphNodeChildren, proposedSize: ProposedViewSize, environment: EnvironmentValues, backend: Backend ) -> ViewLayoutResult { var result = body.computeLayout( widget, children: children, proposedSize: proposedSize, environment: environment, backend: backend ) result.preferences = modification(result.preferences, environment) return result } func commit( _ widget: Backend.Widget, children: any ViewGraphNodeChildren, layout: ViewLayoutResult, environment: EnvironmentValues, backend: Backend ) { body.commit( widget, children: children, layout: layout, environment: environment, backend: backend ) } }