Reputation: 136
EDIT added the source code showing declaration of the variables
I am trying to initialize a view model property which is an @ObservedObject
@ObservedObject private var viewmodel : ExpenseListViewModel
I want to initialize the view model with a repostitory which is going to accept the ManagedObjectContext as a parameter in the constructor
Since viewmodel has a prperty wrapper it is not allowing to create it as a computed property either.
when i tried to initialize the Repository and viewmodel in the init i get an self is used before being initialized
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
private (set) var repo: Repository
@ObservedObject private var viewmodel : ExpenseListViewModel
init() {
//let repository = CoreDataRepository(Context: moc)
repo = CoreDataRepository(Context: self.moc)
self.viewmodel = .init(repository: repo)
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
Upvotes: 1
Views: 1157
Reputation: 257703
The @Environment
is not available on init call phase, it is injected later. So here is possible solution:
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
var body: some View {
InternalContentView(context: moc) // context is ready in body
}
struct InternalContentView: View {
@ObservedObject private var viewmodel: ExpenseListViewModel
init(context: NSManagedObjectContext) {
self.viewmodel = .init(repository: CoreDataRepository(Context: context))
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
}
Upvotes: 3