SwiftUI:`onDrop` 覆盖不会在 LazyVGrid 中消失?

SwiftUI: `onDrop` overlay not going away in LazyVGrid?

我正在测试 Asperi 对单元格重新排序的出色回答:

我遇到的问题是,当我只是进入拖动模式然后放置到位时,叠加层不会重置,请参见单元格 3:

我使用的是在答案中找到的确切代码。所以看起来像这样一行:

.overlay(dragging?.id == d.id ? Color.white.opacity(0.8) : Color.clear)

反应不正常?

知道如何让叠加层更新并返回 clear 吗?

实际上这是一个 SwiftUI 错误,因为在这种情况下 onDrag 被调用,但 onDrop 不是(从 D&D 流程的角度来看这是错误的)。

一个可能的解决方法是引入额外的 in-progress 状态来表明 D&D 真正开始了。 (其实我会想一些重构来简化delegate的接口,但是对于demo是可以的)

测试 Xcode 13.3 / iOS 15.4

更改如下:

  @State private var isUpdating = false // in-progress state

  // ...

  .overlay(dragging?.id == d.id && isUpdating ? // << additional condition
     Color.white.opacity(0.8) : Color.clear)

  // ...

  .onDrop(of: [UTType.text], delegate: DragRelocateDelegate(item: d, listData: $model.data, 
     current: $dragging, updating: $isUpdating)) // << transfer into delegate

  // ...

  func dropEntered(info: DropInfo) {
    updating = true      // << indicate that D&D begins

  // ...

  func performDrop(info: DropInfo) -> Bool {
    self.updating = false // << D&D finished