由于环境对象未正确设置,预览画布崩溃

问题描述 投票:0回答:1

由于环境对象设置不正确,我的预览画布崩溃了。 应用程序本身可以正常构建并运行。

错误信息。

app crashed due to missing environment of type: TaskModel. To resolve this add .environmentObject(TaskModel(...)) to the appropriate preview.

带有 #Preview 宏的我的视图如下所示。

struct CopyTaskListScreen: View {
    @EnvironmentObject private var taskModel: TaskModel
    
    var body: some View {
        NavigationStack {
            List(taskModel.tasks.sorted(by: <), id: \.key) { task in
                Text(task.value.title)
            }
        }
    }
}
#Preview {
    CopyTaskListScreen()
        .environmentObject(TaskModel(//how to call TaskDataService here?))
}

我的任务模型如下所示。我使用 ITaskData 协议注入 TaskDataService。 TaskDataService 接受所有实现 ITaskData 协议的数据适配器并将其交给我的 TaskModel。

@MainActor
class TaskModel: ObservableObject {
    @Published var tasks: [UUID: Task] = [:]
    
    var data: TaskDataService
    
    init(data: ITaskData) {
        self.data = TaskDataService(data: data)
        readTasks()
    }

我尝试在#Preview 中注入环境,就像在@main 中一样。但结果相同。预览画布崩溃了。

@main
struct mTaskApp: App {

    var body: some Scene {
        WindowGroup {
            MainScreen()
              .environmentObject(TaskModel(data: TaskDataService(data: RemindersDataAdapter())))
swiftui swiftui-environment
1个回答
0
投票

通常您的服务将是一个 EnvironmentKey,例如

@Environment(\.taskDataService) var taskDataService
@EnvironmentObject private var taskModel: TaskModel

并且会像这样使用它

.task {
    await taskDataService.load(into: taskModel)
}

那么在预览中它将是:

#Preview {
    CopyTaskListScreen()
        .environment(\.taskDataService, MockTaskDataService())
        .environmentObject(TaskModel())
}
© www.soinside.com 2019 - 2024. All rights reserved.