swift-composable-app-example icon indicating copy to clipboard operation
swift-composable-app-example copied to clipboard

Duplicated/invalid actions are received when tab view appear

Open darrarski opened this issue 4 years ago • 1 comments

Description

Reported by @saroar in a comment to another issue.

Steps to reproduce

  1. Add onAppear actions to each component.
  2. Send the onAppear action to the ViewStore inside .onAppear(perform:) modifier in each view.
  3. In each of the reducers, just return .none effect when onAppear action is received.
  4. Run the app and randomly switch tabs.

Expected behavior

  1. Whenever tab is switched, onAppear action of the currently selected tab's component should be received.

Actual behavior

  1. Sometimes wrong onAppear action is received, for example when switching from "Color" to "Shape" tab, instead of single ShapeAction.onAppear, two actions are received: ShapeAction.onAppear and then PreviewAction.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.

darrarski avatar Apr 12 '21 16:04 darrarski

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.

darrarski avatar Apr 12 '21 17:04 darrarski