Estou tentando escrever um código que insira um novo item no SwiftData se ele ainda não existir. Estou recebendo erros sobre o ModelContext
qual não consigo resolver.
O código a seguir é uma versão enxuta que é o suficiente para gerar os erros. Eu removi a lógica para testar um item existente até que eu possa superar esse problema.
Desculpe pela extensão:
import SwiftUI
import SwiftData
@Model
class TestData {
@Attribute(.unique) var id: String
var value: String
init(id: String, value: String) {
self.id = id
self.value = value
}
}
struct EditTestItem: View {
@Bindable var testData: TestData
var body: some View {
VStack {
HStack {
Text($testData.id)
TextField("Enter Data Here", text: $testData.value)
}
}
.modelContainer(for: TestData.self)
}
}
struct TestContent: View {
var testIDValue: String = ""
@Environment(\.modelContext) private var modelContext
@Query var testData: [TestData]
var testItem: TestData
init(testID: String) {
testItem = TestData(id: testID, value: "New value: \(testID)")
let _ = modelContext.insert(testItem)
do {
try modelContext.save()
} catch {
print("\(#line) oops")
}
}
var body: some View {
VStack {
VStack {
Text(testIDValue)
Text("\(testData.count)")
EditTestItem(testData: testItem)
}
Button("Save", action: {
try? modelContext.save()
})
}
.modelContainer(for: TestData.self)
.onAppear {
}
}
}
#Preview {
TestContent(testID: "b")
.modelContainer(for: TestData.self)
.frame(width: 400)
}
Os erros incluem:
Acessando o valor do Environment fora de ser instalado em uma View. Isso sempre lerá o valor padrão e não atualizará.
e
Defina um .modelContext no ambiente da visualização para usar a consulta
Certamente não é adicionar dados.
Qual é a maneira correta de fazer isso?
Eu criaria o objeto de teste em
onAppear
vez de usarinit
.Para maior clareza, vamos ter todo o código relacionado em uma única função que verifica se há um objeto existente e cria um novo se nenhum existir
Então precisamos fazer algumas alterações na visualização para manter o id e o objeto e chamar a nova função
Aqui está meu código de teste que funciona para mim, usado
TestData
para testes.