You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中使用NavigationStack时DetailView无法显示bio求助

解决SwiftUI NavigationStack传递GithubUser后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:40:05