首页 > 解决方案 > 一旦新的 SwiftUI 视图完全加载,@State 变量就会被清除

问题描述

每当我调用视图 CardronaView() 时,@State 变量将加载正确的数据约 3 秒,然后它将被重置为默认值,即空字符串。我怎样才能解决这个问题?我用这个来调用新视图:

NavigationView {
            List {
                // MARK: - Display Cardrona
                NavigationLink(destination: CardronaView()) {
                    ZStack(alignment: .topLeading) {
                        Image("Cardrona-header")
                        Text("Cardrona").font(.largeTitle).fontWeight(.semibold).foregroundColor(Color.black)
                        Text(cardTemp).foregroundColor(Color.black).padding(.top, 50).font(.title3)
                    }
                }
            }
        }

新视图中的代码是这样的:

struct CardronaView: View {
    
    @State var cardDate: String = ""
    
    var body: some View {
        List {
            Text(cardDate)
        }.onAppear {
            Api().getJsonCard { (Cardrona) in
                cardDate = "\(Cardrona.data_updated)"
            }
        }
    }
}

标签: swiftui

解决方案


发出网络请求时,最好在加载下一个视图之前执行它。这样做有很多很好的理由,因为如果调用不成功,则不会加载新视图并避免糟糕的用户体验。这是您向用户显示无法拨打电话的警报的地方。

如果网络调用成功,您将结果传递给新视图并填充它。

由于网络调用是异步的,并且您进行此调用 .onAppear,如果调用时间过长,您将看到空字符串,因为您的视图已经加载。

我以在先例视图上进行网络调用的方式更改了您的代码。但也许您应该在用户点击 ListCell 时添加代码,如果调用成功,则 NavigationLink 触发其目标参数,即 CardonaView(cardDate:)。

struct ContentView: View {
  
  @State var cardDate: String = ""
  
  var body: some View {
    NavigationView {
      List {
        // MARK: - Display Cardrona
        NavigationLink(destination: CardronaView(cardDate: cardDate)) {
          ZStack(alignment: .topLeading) {
            Image("Cardrona-header")
            Text("Cardrona").font(.largeTitle).fontWeight(.semibold).foregroundColor(Color.black)
            Text(cardTemp).foregroundColor(Color.black).padding(.top, 50).font(.title3)
          }
        }
      }
    }
    .onAppear {
      Api().getJsonCard { (Cardrona) in
        cardDate = "\(Cardrona.data_updated)"
    }
  }
}

struct CardronaView: View {
  
  var cardDate: String
  
  var body: some View {
    List {
      Text(cardDate)
    }
  }
}

推荐阅读