Skip to content

Instantly share code, notes, and snippets.

@tcldr
Last active December 9, 2024 13:28
Show Gist options
  • Save tcldr/9655100dbecb6a93d20fd5fc172a22b2 to your computer and use it in GitHub Desktop.
Save tcldr/9655100dbecb6a93d20fd5fc172a22b2 to your computer and use it in GitHub Desktop.
SwiftUI Environment Service
import SwiftUI
class SomeService: Observable {
let message: String
init(message: String) {
self.message = message
}
func announce() {
print(message)
}
}
struct ContentView: View {
@State var service = SomeService(message: "initialised")
var body: some View {
VStack {
InnerView()
.padding()
.environment(service)
HStack {
Button("Use Service A") {
service = SomeService(message: "using service a")
}
Button("Use Service B") {
service = SomeService(message: "using service b")
}
}
.buttonStyle(.borderedProminent)
}
}
}
struct InnerView: View {
@Environment(SomeService.self) var service
var body: some View {
let _ = print("redrawing")
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
Button("Announce") {
service.announce()
}
}
}
}
#Preview {
ContentView()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment