I am facing the issue that changes to the array items are not propagated to the parent view. The text in the inner view does get updated. However, changes to the same item are not displayed in the parent.
This is an extremely reduced version of my issue. Removing the array or manually sending objectWillChange is, in my opinion, not a good solution as It is quite likely to forget it. Changing the ViewModel to a struct does not work for me as I am updating the ViewModel from multiple places.
import SwiftUI
class ViewModel: Identifiable, ObservableObject {
    var label: String = ""
    @Published var big: Bool
    init(label: String, big: Bool) {
        self.big = big
        self.label = label
    }
}
class ArrayViewModel: ObservableObject {
    @Published var items: [ViewModel]
    init(items: [ViewModel] = [ViewModel]()) {
        self.items = items
    }
    init() {
        self.items = [ViewModel]()
    }
}
struct ContentView: View {
    @StateObject var items = ArrayViewModel(items: [ViewModel(label: "view ex", big: true)])
    var body: some View {
        VStack {
            ForEach(0 ..< items.items.count, id: \.self) { index in
                Text(items.items[index].big ? "big" : "small")
                Button("outer toggle") {
                    items.items[index].big.toggle()
                }
                InnerCard()
                    .environmentObject(items.items[index])
            }
        }
    }
}
struct InnerCard: View {
    @EnvironmentObject var currentItem: ViewModel
    var body: some View {
        Text(currentItem.big ? "big" : "small")
        Button("inner toggle") {
            currentItem.big.toggle()
        }
    }
}
#Preview {
    ContentView()
}


objectWillChangeis not a good solution? An alternative would be to use@Observable, but it’d be even better to just not use classes. Use structs instead.ForEach@Published.Viewstruct that you write is literally the view model. SwiftUI creates the actual views for you, based on yourViewstructs.