No insert animation after `insert` when using SwiftData.

Hi,

After running the Xcode template "New project > (SwiftUI, SwiftData)" I noticed that there is no insert animation into the list.

The project is a pure vanilla project created from Xcode (Version 16.2 (16C5032a)) and the code is a simple as it gets:

//
//  ContentView.swift
//

import SwiftUI
import SwiftData

struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var items: [Item]

    var body: some View {
        NavigationSplitView {
            List {
                ForEach(items) { item in
                    NavigationLink {
                        Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))")
                    } label: {
                        Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
                    }
                }
                .onDelete(perform: deleteItems)
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    EditButton()
                }
                ToolbarItem {
                    Button(action: addItem) {
                        Label("Add Item", systemImage: "plus")
                    }
                }
            }
        } detail: {
            Text("Select an item")
        }
    }

    private func addItem() {
        withAnimation {
            let newItem = Item(timestamp: Date())
            modelContext.insert(newItem)
        }
    }

    private func deleteItems(offsets: IndexSet) {
        withAnimation {
            for index in offsets {
                modelContext.delete(items[index])
            }
        }
    }
}

#Preview {
    ContentView()
        .modelContainer(for: Item.self, inMemory: true)
}

As you see the template's code does have withAnimation inside addItem but there is no animation. The new added item appears without animation in the the List

Here is a short video. Is this a known bug?

Answered by DTS Engineer in 822801022

Did you try to specify an animation for the Query? The following code tells SwiftUI to use .default animation, and it works for me:

@Query(animation: .default) private var items: [Item]

You might also be interested in seeing the following post for more discussion on this topic:

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

Did you try to specify an animation for the Query? The following code tells SwiftUI to use .default animation, and it works for me:

@Query(animation: .default) private var items: [Item]

You might also be interested in seeing the following post for more discussion on this topic:

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

Accepted Answer

@DTS Engineer Thank for the reply.

Yes this work and there is now animation when I change the Query animation. Very strange that the Xcode template does not show this out of the box and shows the not working and unnecessary withAnimation block in the add function.

But now I have a slightly different problem, again with no animation after insert.

If I save the modelContext the animation now is gone:

@Query(animation: .default) private var items: [Item]

...

private func addItem() {
    let newItem = Item(timestamp: Date())
    modelContext.insert(newItem)
    
    do {
        try modelContext.save()
    } catch {
        
    }
}

How can someone achieve an insert and save + animation?

Saving the model context indeed breaks the animation... This is the point where I’d suggest that you file a feedback report for SwiftUI folks to investigate – If you do so, please share your report ID here for folks to track.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

@DTS Engineer

Thank you.

I have submitted feedback with report ID FB16426138

No insert animation after `insert` when using SwiftData.
 
 
Q