-
Notifications
You must be signed in to change notification settings - Fork 0
Exploring bidirectional Swift states
Justin Bush edited this page Jun 9, 2024
·
2 revisions
Implementation as of Synchronous bidirectional variable states #6
- Declare in React view:
const [switchValue, setSwitchValue] = useExposeState<boolean>(true, 'switchValue');
-
swiftgen
-
Connect in SwiftUI view:
let manager: ObservableWebViewManager
@State private var switchValue: Bool = true
ObservableWebView(manager: manager)
// change happened in React side
.tsMessageHandler(.switchValue { newValue in
switchValue = newValue // update Swift var
}, manager: manager)
// change happened on Swift side
.onChange(of: switchValue) {
manager.ts(.switchValue(switchValue)) // update React var
}
Hook up state variables with one line of code.
ObservableWebView(manager: manager)
.sync(.switchValue, $switchValue, manager: manager)
SwiftGen generates one State variable.
- Updating it from Swift will automatically update the React variable
- Updating it from React will automatically update the Swift variable
@Observable
class Variables {
init(manager: WKWebView) { ... }
let webView: WKWebView
var switchValue: TypeSwiftObservable {
get: // retrieve from React
set: // set in React
}
func render() {
withObservationTracking {
for variable in TypeSwift.Variables {
// case .switchValue: self.switchValue = switchValue
}
} onChange: {
render()
}
}
}
Usage
.onChange(of: switchValue) {
// do something
}
Usage
@Environment(\.variable) private var variable
variable.switchValue // call directly
variable.$switchValue // edit directly