【问题标题】:swiftUI: Changing @State in onAppear crashesswiftUI:在 onAppear 崩溃中更改 @State
【发布时间】:2020-03-12 22:17:11
【问题描述】:

如果视图通过调用服务出现,我想设置一个@State 变量。
onAppear 中调用服务会使应用程序崩溃。
在按钮操作中调用服务可以正常工作。

struct ContentView: View {
  @State var dirContent : [String] = []

  var body: some View {
    VStack {
      List {
        ForEach(dirContent, id: \.self){
          fileName in
          Text(fileName)
        }
      }
      Button("Get Data"){self.dirContent = Service.getData()}
    }
    .onAppear{
    //self.dirContent = Service.getData2()   // Crashes!!
    }
  }
}

class Service{
  static func getData()->[String]{
    // ... get Data from somewhere
    return ["line1", "line2"]
  }

  static func getData2()->[String]{
    // ... get Data from somewhere
    return ["line4", "line5"]
  }
}

怎么了?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    看看为什么会这样,试着修改你的代码

        var body: some View {
            VStack {
                List {
                    ForEach(dirContent, id: \.self){
                        fileName in
                        Text(fileName).onAppear {
                            print("item appear")
                        }
                    }
                }.onAppear {
                    print("list appear")
                }
                Button("Get Data"){self.dirContent = Service.getData()}
            }
            .onAppear{
                print("content appear")
                DispatchQueue.main.async {
                    self.dirContent = Service.getData2()
                }
            }
        }
    

    “老派”调试打印向我们展示了

    content appear
    list appear
    item appear
    item appear
    

    现在很清楚了,不是吗?

    【讨论】:

      【解决方案2】:

      我想我明白了。 该操作必须异步调用。

      .onAppear{
        DispatchQueue.main.async {
          self.dirContent = Service.getData2()   
        }
      }
      

      任何想法,为什么在按钮操作中不需要这样做?

      【讨论】:

      • 你已经找到了。为什么? 1) .onAppear 更改状态包装属性。 2) SwiftUI 必须重新评估它的主体。 3)评估时,身体应该出现......并且循环继续1)。将更改分派到下一个 runloop 执行将停止循环。 .onAppear 表示在显示之前:-)
      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多