SwiftUI isPresented 环境未更新以消除工作表

Eth*_*Kay 5 ios swift swiftui

给出以下最小的可重现示例:

struct ParentView: View {
  @State private var showSheet = false
  
  var body: some View {
    return Button("Show sheet") {
      showSheet.toggle()
    }.sheet(
      isPresented: $showSheet,
      onDismiss: {
        print("Parent onDismiss")
      },
      content: {
        NavigationView {
          SheetView(parentShowSheet: $showSheet)
        }
      }
    )
  }
}

struct SheetView: View {
  @Environment(\.dismiss) private var dismiss
  @Environment(\.isPresented) private var isPresented
  @Binding var parentShowSheet: Bool
  
  var body: some View {
    Button("Manual close") {
      dismiss()
    }
    .onChange(of: isPresented) { isPresented in
      print("Sheet isPresented", isPresented)
    }
    .onChange(of: parentShowSheet) { parentShowSheet in
      print("Sheet parentShowSheet", parentShowSheet)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

SheetView方法onChange没有按照我期望的方式触发。在此示例中,有两种方法可以在打开工作表后将其关闭:

  1. 单击触发的“手动关闭”按钮dismiss(),或
  2. .interactiveDismissDisabled(true)下拉工作表以触发“交互式关闭”(添加到视图时禁用的东西)。

如果您尝试这两种方法,您会发现,对于 (1),您将得到两个打印语句“Sheet ParentShowSheet”和“Parent onDismiss”,而对于 (2),您只会得到一个打印语句“Parent onDimiss”。

三个问题:

  • 为什么在情况 (2) 中不打印“Sheet ParentShowSheet”?
  • 为什么在这两种情况下都不会打印“Sheet isPresented”?我认为放弃一张纸实际上改变了它的Environment(\.isPresented)价值。
  • 如何在使用方法 (1) 或方法 (2) 解除时触发的钩子内部SheetView添加一个钩子(例如,其操作类似于我的 onChange 方法,但实际上在两种情况下都有效)?