Pass Realm Data Between SwiftUI Views
On this page
The Realm Swift SDK provides several ways to pass realm data between views:
Pass Realm objects to a view
Use environment injection to:
Inject a partition value into a view
Inject an opened realm into a view
Inject a realm configuration into a view
Pass Realm Objects to a View
When you use the @ObservedRealmObject
or @ObservedResults
property
wrapper, you implicitly open a realm and retrieve the specified objects
or results. You can then pass those objects to a view further down the
hierarchy.
struct DogsView: View { Dog.self) var dogs ( /// The button to be displayed on the top left. var leadingBarButton: AnyView? var body: some View { NavigationView { VStack { // The list shows the dogs in the realm. // The ``@ObservedResults`` above implicitly opens a realm and retrieves // all the Dog objects. We can then pass those objects to views further down the // hierarchy. List { ForEach(dogs) { dog in DogRow(dog: dog) }.onDelete(perform: $dogs.remove) }.listStyle(GroupedListStyle()) .navigationBarTitle("Dogs", displayMode: .large) .navigationBarBackButtonHidden(true) .navigationBarItems( leading: self.leadingBarButton, // Edit button on the right to enable rearranging items trailing: EditButton()) }.padding() } } }
Pass Environment Values
Environment injection is a useful tool in SwiftUI development with Realm. Realm property wrappers provide different ways for you to work with environment values when developing your SwiftUI application.
Inject the Partition Value
If you are using Partition-Based Sync, you
can use environment injection to pass the .partitionValue
environment
value. Inject this into a view where you perform the @AsyncOpen
or
@AutoOpen
:
// If there is a logged in user, pass the user ID as the // partitionValue to the view that opens a realm. OpenPartitionBasedSyncRealmView().environment(\.partitionValue, user.id)
Then, when you use the property wrapper to open a synced realm, leave
the partitionValue
an empty string. The property wrapper populates the
value from the environment object passed in from above.
// We can use an empty string as the partitionValue here because we're // injecting the user.id as an environment value from the LoginView. YOUR_APP_SERVICES_APP_ID_HERE, partitionValue: "", timeout: 4000) var autoOpen (appId:
Tip
Migrate to Flexible Sync
You can automatically migrate your App Services Device Sync Mode from Partition-Based Sync to Flexible Sync. This enables you to take advantage of the more expressive and granular Flexible Sync subscriptions and permissions to manage what synced data your users can read and write. For more information, refer to Migrate from Partition-Based Sync to Flexible Sync.
Inject an Opened Realm
You can inject a realm that you opened in another SwiftUI view into a view as an environment value. The property wrapper uses this passed-in realm to populate the view:
ListView() .environment(\.realm, realm)
Inject a Realm Configuration
You can use a realm other than the default realm by passing a different configuration in an environment object.
LocalOnlyContentView() .environment(\.realmConfiguration, Realm.Configuration( /* ... */ ))