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

从JSON API获取数据后无法传递到SwiftUI视图,值始终为nil

问题排查与解决方案

可能的原因及修复步骤

  1. 闭包参数命名冲突(易混淆)
    你的onAppear闭包中,参数名solisResults和视图的@State变量同名,虽然你用了self.来区分,但这种命名方式容易引发误解,建议重命名闭包参数:

    .onAppear{
        getSCPosts(completion: { result in 
            self.solisResults = result 
        })
    }
    
  2. @State 用于网络状态管理的局限性
    @State更适合视图内部的简单状态,网络请求这类异步数据更新,推荐使用@StateObject结合ObservableObject来管理,能更稳定地触发视图刷新:

    • 首先创建视图模型:
      class SolisViewModel: ObservableObject {
          @Published var solisResults: PlantData?
          
          func fetchSolisData() {
              getSCPosts { [weak self] plantData in
                  DispatchQueue.main.async {
                      self?.solisResults = plantData
                  }
              }
          }
      }
      
    • 然后修改视图:
      struct SolisCloud: View {
          @StateObject private var viewModel = SolisViewModel()
          
          var body: some View {
              VStack {
                  Text("My Solis Energy")
                  // 测试显示数据,验证是否更新
                  if let data = viewModel.solisResults {
                      Text("电池电量: \(data.batteryPercent)%")
                      Text("当日发电量: \(data.dayEnergy)")
                  }
              }
              .onAppear {
                  viewModel.fetchSolisData()
              }
          }
      }
      
  3. 确认onAppear是否触发
    检查SolisCloud视图是否被正确添加到父视图层级中,是否存在条件渲染(如if判断)导致视图从未出现、onAppear未执行的情况。

  4. 添加调试日志验证状态更新
    在闭包中添加日志,确认是否真的执行了赋值操作:

    getSCPosts(completion: { result in 
        print("准备赋值solisResults: \(result)")
        self.solisResults = result
        print("赋值后solisResults: \(self.solisResults)")
    })
    

额外注意事项

  • 在异步回调中使用[weak self]避免循环引用(尤其是将网络请求逻辑放在视图模型中时)。
  • 确保getSCPosts中的request是有效的URLRequest,没有权限、URL错误等问题(虽然你提到解析成功,但仍需确认请求的稳定性)。

内容的提问来源于stack exchange,提问作者Marc H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:21