0

I'm getting this Fatal Error for the listViewModel. Do I add the @ObservableObject var listViewModel: MakeMyOwnListViewModel to the MakeMyOwnListView.swift or ManifestationMenuApp.swift file?

Thread 1: Fatal error: No ObservableObject of type MakeMyOwnListViewModel found. A View.environmentObject(_:) for MakeMyOwnListViewModel may be missing as an ancestor of this view.

I'm confused about my understanding of ObservableObject and environmentObject any direction would be great.

MakeMyOwnListView.swift

import SwiftUI

struct MakeMyOwnListView: View {
    
    @EnvironmentObject var listViewModel: MakeMyOwnListViewModel
    // @ObservableObject var listViewModel: MakeMyOwnListViewModel
    
    var body: some View {
        ZStack {
            if listViewModel.items.isEmpty {
                MakeMyOwnNoItemsView()
                    .transition(AnyTransition.opacity.animation(.easeIn))
            } else {
                List {
                    ForEach(listViewModel.items) { item in
                        MakeMyOwnListRowView(item: item)
                            .onTapGesture {
                                    listViewModel.updateItem(item: item)
                            }
                    }
                    .onDelete(perform: listViewModel.deleteItem)
                    .onMove(perform: listViewModel.moveItem)
                }
                .listStyle(PlainListStyle())

            }
        }
        // Navigation Title
        .navigationTitle("Make My Own ✍")
        // Navigation Butons
        .navigationBarItems(
            leading: EditButton(),
            trailing:
                NavigationLink("Add", destination:
                                MakeMyOwnAddView())
        )
    }
    
}

struct MakeMyOwnListView_Previews: PreviewProvider {
    static var previews: some View {
        // Add NavigationView now we have the same environment in realtime when we are running our App
        NavigationView {
            MakeMyOwnListView()
        }
        .environmentObject(MakeMyOwnListViewModel())
    }
}

ManifestationMenuApp.swift

import SwiftUI

@main
struct ManifestationMenuApp: App {
    
    @AppStorage("isOnboarding") var isOnboarding: Bool = true
    
    @StateObject var listViewModel: MakeMyOwnListViewModel = MakeMyOwnListViewModel()
    
    // @ObservableObject var listViewModel: MakeMyOwnListViewModel
    // @EnvironmentObject var _listViewModel: MakeMyOwnListViewModel
    
    var body: some Scene {
        WindowGroup {
            if isOnboarding {
                OnboardingView()
            } else {
                MainView()
                    .environmentObject(MenuListFriendshipViewModel())
                    .environmentObject(MenuListWealthViewModel())
                    .environmentObject(MenuListEducationViewModel())
                    .environmentObject(MenuListCareerViewModel())
                    .environmentObject(MenuListFamilyViewModel())
                    .environmentObject(MenuListHealthViewModel())
                    .environmentObject(MenuListSpiritualityViewModel())
            }
        }
        
        WindowGroup {
            // Now all are views will be in a Navigation View
            NavigationView {
                MakeMyOwnListView()
            }
            // iPad - A navigation view style represented by a view stack that only shows a single top view at a time.
            .navigationViewStyle(StackNavigationViewStyle())
            .environmentObject(MakeMyOwnListViewModel())
            
        }
    }
}

MakeMyOwnListView.swift

ManifestationMenuApp.swift

Ken White
  • 123,280
  • 14
  • 225
  • 444

0 Answers0