@@ -200,12 +200,11 @@ package struct DynamicContainer {
200200private class DynamicAnimationListener : AnimationListener , @unchecked Sendable {
201201 weak var viewGraph : ViewGraph ?
202202 let asyncSignal : WeakAttribute < Void >
203- var count : Int
203+ var count : Int = 0
204204
205205 init ( viewGraph: ViewGraph ? , asyncSignal: WeakAttribute < Void > ) {
206206 self . viewGraph = viewGraph
207207 self . asyncSignal = asyncSignal
208- self . count = 0
209208 }
210209
211210 override func animationWasAdded( ) {
@@ -583,8 +582,43 @@ struct DynamicContainerInfo<Adapter>: StatefulRule, AsyncAttribute, ObservedAttr
583582 at index: Int ,
584583 disableTransitions: Bool
585584 ) -> Bool {
586- _openSwiftUIUnimplementedWarning ( )
587- return . random( )
585+ let items = info. items
586+ guard let phase = items [ index] . phase else {
587+ return false
588+ }
589+ switch phase {
590+ case . willAppear:
591+ preconditionFailure ( " " )
592+ case . identity:
593+ guard !disableTransitions, items [ index] . needsTransitions else {
594+ eraseItem ( at: index)
595+ return true
596+ }
597+ lastRemoved = max ( lastRemoved &+ 1 , 1 )
598+ items [ index] . removalOrder = lastRemoved
599+ info. removedCount &+= 1
600+ items [ index] . phase = . didDisappear
601+ if let listener = items [ index] . listener {
602+ listener. viewGraph = nil
603+ }
604+ let newListener = DynamicAnimationListener (
605+ viewGraph: . current,
606+ asyncSignal: WeakAttribute ( $asyncSignal)
607+ )
608+ items [ index] . listener = newListener
609+ newListener. animationWasAdded ( )
610+ Update . enqueueAction { // TODO: reason
611+ newListener. animationWasRemoved ( )
612+ }
613+ return false
614+ case . didDisappear:
615+ let listener = items [ index] . listener!
616+ guard listener. count == 0 else {
617+ return false
618+ }
619+ eraseItem ( at: index)
620+ return true
621+ }
588622 }
589623
590624 func unremoveItem( at index: Int ) {
0 commit comments