You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.4 KiB
1.4 KiB
Context
You can replicate the context functionality found in React by using a combination of BindableObject
, Combine
and defining an environmentObject
for a View. You create a class that adheres to the BindableObject
and provide that as an argument to environmentObject
when initiating your parent view. Any child of that parent view can then access the class using @EnvironmentObject
.
React
import React, { useContext } from "react";
const Session = React.createContext({ name: "" });
export function ContextProvider() {
return (
<Session.Provider value={{ name: "Bento" }}>
<Parent />
</Session.Provider>
);
}
export function Parent() {
return <Child />;
}
export function Child() {
const session = useContext(Session);
return <span>Hello {session.name}</span>;
}
SwiftUI
import SwiftUI
import Combine
final class Session: BindableObject {
let didChange = PassthroughSubject<Session, Never>()
var name: String {
didSet { didChange.send(self) }
}
init(name: String) {
self.name = name
}
}
struct ContextProvider : View {
var body: some View {
Parent().environmentObject(Session(name: "Bento"))
}
}
struct Parent : View {
var body: some View {
Child()
}
}
struct Child : View {
@EnvironmentObject var session: Session
var body: some View {
Text("Hello \(session.name)")
}
}