swift-composable-app-example
swift-composable-app-example copied to clipboard
Duplicated/invalid actions are received when tab view appear
Description
Reported by @saroar in a comment to another issue.
Steps to reproduce
- Add
onAppearactions to each component. - Send the
onAppearaction to theViewStoreinside.onAppear(perform:)modifier in each view. - In each of the reducers, just return
.noneeffect whenonAppearaction is received. - Run the app and randomly switch tabs.
Expected behavior
- Whenever tab is switched,
onAppearaction of the currently selected tab's component should be received.
Actual behavior
- Sometimes wrong
onAppearaction is received, for example when switching from "Color" to "Shape" tab, instead of singleShapeAction.onAppear, two actions are received:ShapeAction.onAppearand thenPreviewAction.onAppear.
Testing notes
The issue occurs only when action is sent to the ViewStore in .onAppear(perform:) modifier. When not sending the action in the closure (but for example just printing something to the console) - everything is working as expected.
This is a strange issue indeed. It's hard to tell if this is a bug in SwiftUI or a problem with ComposableArchitecture. It seems to be only reproducible when action is sent inside .onAppear(perform:) modifier.
As a workaround (which I can confirm solves the problem) we can move .onAppear(perform:) from the body of a view presented in a tab to the place where it's created. It's not an ideal solution, though. I applied the workaround in #3 in this commit: 48e36d1.