Passe dados de domínio entre visualizações SwiftUI
Nesta página
O Realm Swift SDK oferece várias maneiras de passar dados de domínio entre visualizações:
Passe Objeto de Realm para uma visualização
Use a injeção de ambiente para:
Injetar um valor da partição em uma visualização
Injete um Realm aberto em uma visualização
Injetar uma configuração de Realm em uma visualização
Passe Objeto de Realm para uma visualização
Ao usar o wrapper de propriedade @ObservedRealmObject
ou @ObservedResults
, você abre implicitamente um Realm e recupera o objeto ou resultados especificados. Em seguida, você pode passar esses objetos para uma visualização mais abaixo na hierarquia.
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() } } }
Passe valores de ambiente
Ambiente a injeção é uma ferramenta útil no desenvolvimento da SwiftUI com o Realm . Os wrappers de propriedade de Realm oferecem maneiras diferentes de trabalhar com valores de ambiente ao desenvolver seu aplicação SwiftUI.
Injetar o valor da partição
Se você estiver usando a sincronização baseada em partição, poderá usar a injeção de ambiente para passar o valor de ambiente .partitionValue
. Injete isso em uma visualização onde você executa o @AsyncOpen
ou @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)
Em seguida, quando você usar o wrapper da propriedade para abrir um domínio sincronizado, deixe o partitionValue
uma string vazia. O wrapper de propriedade preenche o valor do objeto de ambiente passado de cima.
// 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:
Dica
Migrar para a Flexible Sync
Você pode migrar automaticamente seu Atlas App Services Device Sync Mode da Partition-Based Sync para a Flexible Sync. Isso permite que você aproveite as assinaturas e permissões do Flexible Sync mais expressivas e granulares para gerenciar quais dados sincronizados seus usuários podem ler e escrever. Para obter mais informações, consulte Migrar da Partition-Based Sync para a Flexible Sync.
Injetar um Realm Aberto
Você pode injetar um Realm que você abriu em outra visualização do SwiftUI em uma visualização como um valor de ambiente. O invólucro da propriedade usa esse Realm passado para preencher a visualização:
ListView() .environment(\.realm, realm)
Injetar uma configuração de Realm
Você pode usar um realm diferente do realm padrão passando uma configuração diferente em um objeto de ambiente.
LocalOnlyContentView() .environment(\.realmConfiguration, Realm.Configuration( /* ... */ ))