software-mansion / react-native-screens

Native navigation primitives for your React Native app.
MIT License
2.91k stars 498 forks source link

Android ComposeView, Composable is gone upon returning to Screen from stack #2098

Open emitchel opened 3 months ago

emitchel commented 3 months ago

Description

tldr; Jetpack ComposeViews do not maintain state or recompose upon returning to a Screen with a ComposeView driving a component of the Screen.

Suppose you have three screens, screens A, B and C

Screen B has a View that links to a ComposeView(..) from Android Navigating to Screen C, then returning to Screen B, the ComposeView driven component is gone

According to this issue tracker, https://issuetracker.google.com/issues/284424175, the issue lies within how ScreenFragment recycles the views https://github.com/software-mansion/react-native-screens/blob/main/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt#L307-L321

https://github.com/react-native-community/discussions-and-proposals/issues/446#issuecomment-1012686694

Project to repro (thanks to @thevoiceless) - https://github.com/thevoiceless/RN-Compose-Playground

https://github.com/software-mansion/react-native-screens/assets/3791583/e0a08eb2-4eab-4ca1-ae8e-a3c4e37d1688

Steps to reproduce

  1. Use a SimpleViewManager to wrap a ComposeView
  2. Build the ComposeView with a simple Text(..)
  3. But that ComposeView in Screen A
  4. Navigate to Screen B
  5. Navigate BACK to Screen A
  6. Notice that the ComposeView is gone but the wrapper of the view itself is still in the hierarchy

Snack or a link to a repository

https://github.com/thevoiceless/RN-Compose-Playground

Screens version

3.21.0

React Native version

0.73.5

Platforms

Android

JavaScript runtime

None

Workflow

None

Architecture

None

Build type

None

Device

None

Device model

No response

Acknowledgements

Yes

github-actions[bot] commented 3 months ago

Hey! 👋

The issue doesn't seem to contain a minimal reproduction.

Could you provide a snack or a link to a GitHub repository under your username that reproduces the problem?

tboba commented 3 months ago

Hi @emitchel, thanks for filling this issue! Yeah, using Jetpack Compose along React Native Screens have already been heavily discussed in our internal Screens Team 😄 We've got this task of supporting Jetpack Compose on our agenda. Thanks!