SwiftUI: View is not rendered properly

Problem: When clicking on an item, it will be (un-)completed. When it's completed then ChildView should show GroupsView. However, that's not the case.

The logs are like this:

init, group Fruits - items not completed false - showItems false
body, group Fruits - items not completed false - showItems true
init, group Fruits - items not completed false - showItems false
init, group Fruits - items not completed false - showItems false
import SwiftUI
import SwiftData

@main
struct MainApp: App {
    var body: some Scene {
        WindowGroup {
            SomeView()
        }
        .modelContainer(appContainer)
    }
}

struct SomeView: View {
    @Query private var items: [AItem]
    
    var body: some View {
        ParentView(items: items)
        
    }
}

struct ParentView: View {
    private var groupedItems: [GroupedAItems] = []
    
    init(items: [AItem]) {
        Dictionary(grouping: items) { $0.categoryName }
            .forEach {
                let groupedItems = GroupedAItems(categoryName: $0.key, items: $0.value)
                self.groupedItems.append(groupedItems)
            }
    }
    
    var body: some View {
        ScrollView {
            VStack(spacing: 15) {
                ForEach(groupedItems, id: \.self.categoryName) { groupedItems in
                    ChildView(groupedItems)
                }
            }
        }
    }
}

struct ChildView: View {
    public var groupedItems: GroupedAItems
    @State private var showItems: Bool
    
    init(_ groupedItems: GroupedAItems) {
        self.groupedItems = groupedItems
        self._showItems = State(initialValue: !groupedItems.completed)
        print("init, group \(groupedItems.categoryName) - items not completed \(!groupedItems.completed) - showItems \(showItems)")
    }
    
    var body: some View {
        print("body, group \(groupedItems.categoryName) - items not completed \(!groupedItems.completed) - showItems \(showItems)")
        if showItems {
            return AnyView(ItemsSampleView(items: groupedItems.items, onClick: { showItems = false }))
        } else {
            return AnyView(GroupsView(groupedItems: groupedItems, onClick: { showItems = true }))
        }
    }
}

struct ItemsSampleView: View {
    public var items: [AItem]
    public var onClick: () -> Void
    
    private let gridColumns = [GridItem(.adaptive(minimum: CGFloat(70)))]
    
    var body: some View {
        VStack {
            Button {
                onClick()
            } label: {
                Image(systemName: "chevron.down")
            }
            
            Spacer()
            
            LazyVGrid(columns: gridColumns) {
                ForEach(items.sorted(by: {$0.name < $1.name})) { item in
                    Button {
                        item.completed.toggle()
                    } label: {
                        Text(item.name)
                    }
                }
            }
        }
    }
}

struct GroupsView: View {
    public var groupedItems: GroupedAItems
    public var onClick: () -> Void
    
    var body: some View {
        VStack {
            Button {
                onClick()
            } label: {
                Image(systemName: "chevron.down")
            }
            
            Spacer()
            
            Text(groupedItems.categoryName)
        }
    }
}

@Model
final class AItem: Identifiable {
    @Attribute(.unique) public var id: String
    public var name: String
    public var categoryName: String
    public var completed = false
    
    internal init(name: String, categoryName: String) {
        self.id = UUID().uuidString
        self.name = name
        self.categoryName = categoryName
    }
}

struct GroupedAItems {
    var categoryName: String
    var items: [AItem]
    var completed: Bool {
        items.filter { !$0.completed }.isEmpty
    }
}

@MainActor
let appContainer: ModelContainer = {
    do {
        let container = try ModelContainer(for: AItem.self)
        
        // Make sure the persistent store is empty. If it's not, return the non-empty container.
        var itemFetchDescriptor = FetchDescriptor<AItem>()
        itemFetchDescriptor.fetchLimit = 1
        
        guard try container.mainContext.fetch(itemFetchDescriptor).count == 0 else { return container }
        
        container.mainContext.insert(AItem(name: "Apple", categoryName: "Fruits"))
        
        return container
    } catch {
        fatalError("Failed to create container")
    }
}()

@Sanjeev2 Could you review Adding and editing persistent data in your app sample project and try reproducing the issue in the sample? Please let me know how that goes. Thanks

SwiftUI: View is not rendered properly
 
 
Q