swiftui - 一旦新的 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)"
}
}
}
}
解决方案
发出网络请求时,最好在加载下一个视图之前执行它。这样做有很多很好的理由,因为如果调用不成功,则不会加载新视图并避免糟糕的用户体验。这是您向用户显示无法拨打电话的警报的地方。
如果网络调用成功,您将结果传递给新视图并填充它。
由于网络调用是异步的,并且您进行此调用 .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)
}
}
}
推荐阅读
- wordpress - tinymce 初始化位置脚本
- java - 为什么我使用 String.format 方法时不添加逗号?
- c - 在我刚刚创建的这个小游戏中,我的循环运行不佳
- python - 散景:根据分类数据绘制多条线
- spring - 创建自己的 xml 命名空间
- python - GroupBy 聚合函数,一次计算两个值
- html - 如何格式化用户的文本字段输入?
- python - 打开可执行文件,然后不久将其关闭
- python - 类型错误:check_location() 缺少 1 个必需的位置参数:第 33 行中的“totalprices”,在
- reactjs - 在 nextjs 中在哪里计算 fluentui detaillist 的组