With simple view displayed, using default react-native Modal component is perfect. The problem is, the view will be unmounted after the Modal invisible without any chances to keep it alive!
All states of the destroyed view should be saved somewhere (like Redux store) for restoing when open it again such as scroll position, stack-navigation state... The more states we want to restore, the more complicated and cases we have to handle and test!
The module refer ALL code of Modal component in react-native@0.51.0 The modification points are as below:
- In js code
- Keep Modal alive if visible = false
- Add
visible
prop to native module
- In native code
- Clone
RCTModalHostViewManager
andRCTModalHostView
classes to makeRNModalNoUnmountManager
andRNModalHostView
- Add
visible
prop toRNModalHostView
class - Present/Dismiss modal view by the setter of the
visible
prop.
$ npm install react-native-modal-no-unmount --save
$ react-native link react-native-modal-no-unmount
- In XCode, in the project navigator, right click
Libraries
➜Add Files to [your project's name]
- Go to
node_modules
➜react-native-modal-no-unmount
and addRNModalNoUnmount.xcodeproj
- In XCode, in the project navigator, select your project. Add
libRNModalNoUnmount.a
to your project'sBuild Phases
➜Link Binary With Libraries
- Run your project (
Cmd+R
)<
- Open up
android/app/src/main/java/[...]/MainActivity.java
- Add
import com.reactlibrary.RNModalNoUnmountPackage;
to the imports at the top of the file - Add
new RNModalNoUnmountPackage()
to the list returned by thegetPackages()
method
- Append the following lines to
android/settings.gradle
:include ':react-native-modal-no-unmount' project(':react-native-modal-no-unmount').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-modal-no-unmount/android')
- Insert the following lines inside the dependencies block in
android/app/build.gradle
:compile project(':react-native-modal-no-unmount')
import { Modal, Platform } from 'react-native';
import RNModalNoUnmount from 'react-native-modal-no-unmount';
const ModalComponent = Platform.select({
ios: RNModalNoUnmount,
android: Modal,
});
...
render() {
// Using it exactly as what you are doing with Modal component
return <ModalComponent>...</ModalComponent>
}