SwiftUI调用自定义路由报Type '()' cannot conform to View错误
报错原因
- 你的
Navigator.navigate方法的content参数没有添加@ViewBuilder注解,默认不支持SwiftUI的视图构建语法,当闭包内存在多条语句时无法隐式返回视图,会被推断为返回()空类型,不符合View协议要求。 - 调用
navigate时传入的content闭包内有两个独立的顶级视图(图片容器HStack、文字容器VStack),没有用公共父容器包裹,无法合成单一视图返回。
解决方法
步骤1:修改Navigator定义
给navigate方法的content参数添加@ViewBuilder注解,支持SwiftUI视图自动合成:
struct Navigator { static func navigate<T: View>(_ route: Router, @ViewBuilder content: () -> T) -> AnyView { switch route { case .detail(let item): return AnyView(NavigationLink( destination: DetailView(story: item)) { content() }) } } }
步骤2:修改Home内的调用代码
将并列的HStack和VStack放到同一个父容器内(这里要实现左图右文的布局,外层套HStack即可):
Navigator.navigate(.detail(item)) { HStack(spacing: 12) { WebImage(url: URL(string: item.fields.thumbnail)!) .resizable() .scaledToFill() .frame(width: 120, height: 120) .cornerRadius(2) VStack (alignment: .leading, spacing: 5) { Text(item.fields.headline) .font(.headline) .fontWeight(.bold) Text(item.fields.trailText) .font(.caption) } .frame(maxHeight: 120) } }
(你原本包裹WebImage的多余HStack已经删掉,不影响逻辑)
如果你不想修改Navigator的定义,也可以在content闭包内显式return包裹后的父容器视图,效果一致。
内容的提问来源于stack exchange,提问作者Nouman
相关产品推荐
相关产品推荐

