Docs Menu
Docs Home
/ /
Atlas Device SDKs
/ /

Pass Realm Data Between SwiftUI Views

On this page

  • Pass Realm Objects to a View
  • Pass Environment Values
  • Inject the Partition Value
  • Inject an Opened Realm
  • Inject a Realm Configuration

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

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 {
@ObservedResults(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()
}
}
}

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.

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.
@AutoOpen(appId: YOUR_APP_SERVICES_APP_ID_HERE, partitionValue: "", timeout: 4000) var autoOpen

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.

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)

You can use a realm other than the default realm by passing a different configuration in an environment object.

LocalOnlyContentView()
.environment(\.realmConfiguration, Realm.Configuration( /* ... */ ))
← React to Changes