swift 预览生成失败,测试数据

5hcedyr0  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(111)

我使用新的SwiftData将数据持久化到数据库中。出于测试目的,我为UI预览创建了如下假数据:

@MainActor
let modelTestContainer: ModelContainer = {
    do {
        let container = try ModelContainer(
            for: Interest.self, ModelConfiguration(inMemory: true)
        )
        for interest in InterestSample.seed {
            container.mainContext.insert(object: interest)
        }
        return container
    } catch {
        fatalError("Failed to create container")
    }
}()

UI代码编译,但预览失败,并显示以下消息:

Compiling failed: main actor-isolated let 'modelTestContainer' can not be referenced from a non-isolated context

下面是UI代码:

import SwiftUI
import SwiftData

struct Overview: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var interests: [Interest]
    
    var body: some View {
        NavigationView {
            List {
                ForEach(interests) { item in
                    NavigationLink {
                        Text("Item at \(item.createdAt, format: Date.FormatStyle(date: .numeric, time: .standard))")
                    } label: {
                        Text(item.createdAt, format: Date.FormatStyle(date: .numeric, time: .standard))
                    }
                }
                .onDelete(perform: deleteItems)
            }
            .toolbar {
                Button("new") {
                    print("save document")
                }
                Button("publish") {
                    print("save document")
                }
            }
        }
    }
    
    private func addNewInterests() {
        withAnimation {
            //modelContext.insert(newItem)
        }
    }
    
    private func publishInterests() {
        
    }
    
    private func deleteItems(offsets: IndexSet) {
        withAnimation {
            for index in offsets {
                modelContext.delete(interests[index])
            }
        }
    }
}

#Preview {
    Overview()
        .modelContainer(modelTestContainer)
}

为什么预览不起作用?

dsekswqp

dsekswqp1#

这是一个bug,解决方法是告诉编译器假设它是隔离的

MainActor.assumeIsolated

所以呢

#Preview {
    MainActor.assumeIsolated
        Overview()
            .modelContainer(modelTestContainer)
    }
}

相关问题