如何预览使用@Bindable的SwiftUI子视图?
解决SwiftUI @Model + @Bindable子视图的预览崩溃问题
问题原因
@Model 标记的类属于SwiftData框架,它的实例必须关联到ModelContext(SwiftData的上下文环境)才能正常工作。直接创建实例或用.constant()传入的方式,都没有为对象提供必要的SwiftData上下文,导致预览运行时崩溃。
正确实现方式
在预览中创建一个内存中的临时ModelContainer,将测试用的FamilyMember实例插入到上下文,再把容器传递给视图,让@Bindable能正确关联到SwiftData环境:
#Preview { do { // 创建仅存于内存的ModelContainer,避免持久化测试数据 let container = try ModelContainer( for: FamilyMember.self, configurations: ModelConfiguration(isStoredInMemoryOnly: true) ) // 创建测试实例并插入到上下文 let testMember = FamilyMember(name: "Family member") container.mainContext.insert(testMember) return MemberView(member: testMember) .modelContainer(container) } catch { // 处理容器创建失败的情况,预览会显示错误信息 return Text("预览初始化失败:\(error.localizedDescription)") } }
补充说明
- 使用
isStoredInMemoryOnly: true可以确保测试数据不会被持久化到本地,每次预览都会生成全新的测试实例。 - 必须将
modelContainer(container)附加到视图上,这样子视图的@Bindable才能获取到正确的SwiftData上下文。
内容的提问来源于stack exchange,提问作者Aaron Bratcher
相关产品推荐
相关产品推荐

