Daniel Lyons' Notes

PreviewModifier

struct RobotNameSelectorView: View {
    @Environment(RobotNamer.self) private var namer

    var body: some View {
        @Bindable var namer = namer
        List(namer.names, id: \.self, selection: $namer.selected) { option in
            Text(option)
        }
    }
}

struct SampleRobotNamer: PreviewModifier {
    typealias Context = RobotNamer

    static func makeSharedContext() async throws -> Context {
        let url = URL(filePath: "/tmp/local_names.txt")
        return try await RobotNamer(url: url)
    }

    func body(content: Content, context: Context) -> some View {
        content.environment(context)
    }
}

extension PreviewTrait where T == Preview.ViewTraits {
    @MainActor static var sampleNamer: Self = .modifier(SampleRobotNamer())
}

#Preview(traits: .sampleNamer) {
    RobotNameSelectorView()
}
PreviewModifier
Interactive graph