public var body: some View {
List {
...
}
.listStyle(isPhone ? .plain : .sidebar)
}
When I write code like above, I get a compile error: "Member 'sidebar' in 'PlainListStyle' produces result of type 'SidebarListStyle', but context expects 'PlainListStyle'"
It looks like the root cause is:
Protocol 'ListStyle' can only be used as a generic constraint because it has Self or associated type requirements
How can I solve this problem?
Thanks,
I had this problem before and my answer to your question based off of that would be to create a custom ViewModifier
and use @ViewBuilder
so you can handle the compilation error message.
Something like this should work:
struct DeviceAdaptedListStyle: ViewModifier {
var isPhone: Bool { ... }
@ViewBuilder func body(content: Content) -> some View {
if isPhone {
content.listStyle(.plain)
} else {
content.listStyle(.sidebar)
}
}
}
extension List {
func deviceAdaptedListStyle() -> some View {
modifier(DeviceAdaptedListStyle())
}
}
At the moment, there might be a better solution with Swift 5.5, but I haven't checked.