SwiftUI中使用NavigationStack时DetailView无法显示bio求助
问题根源
你当前列表页调用的Github API用户列表/搜索接口,返回的用户数据仅包含基础信息(如login、avatar_url),不包含bio字段。因此传递给DetailView的GithubUser对象中bio属性本身就是nil,自然会显示默认的“No Bio”。
Github的用户详情接口(GET /users/{login})才会返回完整的用户信息,包括bio字段。
解决方案
1. 修改列表页的导航逻辑
不再传递完整的GithubUser对象,改为传递用户的login字段,用于后续请求详情接口:
// 列表页中的NavigationLink修改为 NavigationLink(value: user.login) { // 原有的VStack内容保持不变 } // 对应的navigationDestination修改为String类型 .navigationDestination(for: String.self) { login in DetailView(login: login) }
2. 重构DetailView,添加详情数据请求
让DetailView接收login参数,在视图加载时请求该用户的完整详情数据:
struct DetailView: View { let login: String @State private var user: GithubUser? @State private var isLoading = true var body: some View { VStack { if isLoading { ProgressView() } else if let user = user { AsyncImage(url: URL(string: user.avatarUrl)) { image in image .resizable() .scaledToFit() } placeholder: { Rectangle() .foregroundColor(.secondary) .frame(width: Constants.frameSize, height: Constants.frameSize) }.padding() Text(user.bio ?? "No Bio") .padding() Spacer() } else { Text("加载用户详情失败") } } .navigationTitle(login) .onAppear { fetchUserDetails() } } private func fetchUserDetails() { guard let url = URL(string: "https://api.github.com/users/\(login)") else { isLoading = false return } URLSession.shared.dataTask(with: url) { data, _, error in DispatchQueue.main.async { isLoading = false guard let data = data else { return } let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase // 适配Github API的蛇形命名字段 user = try? decoder.decode(GithubUser.self, from: data) } }.resume() } }
3. 确保JSON解析配置正确
无论是列表接口还是详情接口,解析时必须设置keyDecodingStrategy = .convertFromSnakeCase,保证API返回的蛇形命名字段(如avatar_url)能正确映射到模型的驼峰命名属性(如avatarUrl)。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

