Skip to content

Conversation

@piaskowyk
Copy link
Member

@piaskowyk piaskowyk commented Jun 13, 2024

Summary

This pull request aims to address the lack of Shared Element Transition in Expo Go. The issue stemmed from the initialization process of SET. In Expo Go, Reanimated gets instantiated twice (once for the Expo client and once for the actual application). During initialization, REASharedTransitionManager attempts to swizzle certain methods from react-native-screens but aims to do so only once:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
  ...
  _isConfigured = YES;
});

The variable _isConfigured was only set to true if the swizzling process completed successfully. The problem appeared when the second instance attempted to set up the screens integration, as it had already been done, resulting in the new instance failing to set _isConfigured to true, even if the method swizzling was successful.

The solution involves changing _isConfigured to a class field instead of an instance field.

Test plan

Run Shared Element Transition in Expo Go

@piaskowyk
Copy link
Member Author

@EvanBacon - fixed, thanks for the help yesterday 🤝

@piaskowyk piaskowyk added this pull request to the merge queue Jun 14, 2024
Merged via the queue into main with commit 9160c03 Jun 14, 2024
@piaskowyk piaskowyk deleted the @piaskowyk/fix-set-in-expo-go branch June 14, 2024 07:49
r0h0gg6 pushed a commit to r0h0gg6/react-native-reanimated that referenced this pull request Jul 28, 2025
## Summary

This pull request aims to address the lack of Shared Element Transition
in Expo Go. The issue stemmed from the initialization process of SET. In
Expo Go, Reanimated gets instantiated twice (once for the Expo client
and once for the actual application). During initialization,
`REASharedTransitionManager` attempts to swizzle certain methods from
`react-native-screens` but aims to do so only once:

```objc
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
  ...
  _isConfigured = YES;
});
```

The variable `_isConfigured` was only set to true if the swizzling
process completed successfully. The problem appeared when the second
instance attempted to set up the `screens` integration, as it had
already been done, resulting in the new instance failing to set
`_isConfigured` to true, even if the method swizzling was successful.

The solution involves changing `_isConfigured` to a class field instead
of an instance field.

## Test plan

Run Shared Element Transition in Expo Go
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants