@@ -7,10 +7,12 @@ import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
77import com.facebook.infer.annotation.Assertions
88import com.facebook.react.bridge.ReadableArray
99import com.facebook.react.common.MapBuilder
10+ import com.facebook.react.bridge.LifecycleEventListener
1011import com.facebook.react.uimanager.PixelUtil
1112import com.facebook.react.uimanager.ThemedReactContext
1213import com.facebook.react.uimanager.UIManagerModule
1314import com.facebook.react.uimanager.ViewGroupManager
15+ import com.facebook.react.uimanager.UIManagerHelper
1416import com.facebook.react.uimanager.annotations.ReactProp
1517import com.facebook.react.uimanager.events.EventDispatcher
1618import com.reactnativepagerview.event.PageScrollEvent
@@ -20,15 +22,32 @@ import com.reactnativepagerview.event.PageSelectedEvent
2022
2123class PagerViewViewManager : ViewGroupManager <ViewPager2 >() {
2224 private lateinit var eventDispatcher: EventDispatcher
25+ private lateinit var lifecycleEventListener: LifecycleEventListener
26+
2327
2428 override fun getName (): String {
2529 return REACT_CLASS
2630 }
2731
32+ fun createFragmentAdapter (reactContext : ThemedReactContext ): FragmentAdapter {
33+ return FragmentAdapter ((reactContext.currentActivity as FragmentActivity ? )!! )
34+ }
35+
2836 override fun createViewInstance (reactContext : ThemedReactContext ): ViewPager2 {
2937 val vp = ViewPager2 (reactContext)
30- val adapter = FragmentAdapter ((reactContext.currentActivity as FragmentActivity ? )!! )
31- vp.adapter = adapter
38+ if (reactContext.hasCurrentActivity()) {
39+ vp.adapter = createFragmentAdapter(reactContext);
40+ }
41+ lifecycleEventListener = object : LifecycleEventListener {
42+ override fun onHostResume () {
43+ if (vp.adapter == null && reactContext.hasCurrentActivity()) {
44+ vp.adapter = createFragmentAdapter(reactContext)
45+ }
46+ }
47+ override fun onHostPause () {}
48+ override fun onHostDestroy () {}
49+ }
50+ reactContext.addLifecycleEventListener(lifecycleEventListener);
3251 // https://github.com/callstack/react-native-viewpager/issues/183
3352 vp.isSaveEnabled = false
3453 eventDispatcher = reactContext.getNativeModule(UIManagerModule ::class .java)!! .eventDispatcher
@@ -60,6 +79,11 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
6079 return vp
6180 }
6281
82+ override fun onDropViewInstance (view : ViewPager2 ) {
83+ super .onDropViewInstance(view)
84+ UIManagerHelper .getReactContext(view).removeLifecycleEventListener(lifecycleEventListener);
85+ }
86+
6387 private fun setCurrentItem (view : ViewPager2 , selectedTab : Int , scrollSmooth : Boolean ) {
6488 refreshViewChildrenLayout(view)
6589 view.setCurrentItem(selectedTab, scrollSmooth)
@@ -69,19 +93,19 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
6993 if (child == null ) {
7094 return
7195 }
72- (parent.adapter as FragmentAdapter ? )!! .addFragment(child, index)
96+ (parent.adapter as FragmentAdapter ? )? .addFragment(child, index)
7397 }
7498
7599 override fun getChildCount (parent : ViewPager2 ): Int {
76- return parent.adapter!! .itemCount
100+ return parent? .adapter? .itemCount ? : 0 ;
77101 }
78102
79103 override fun getChildAt (parent : ViewPager2 , index : Int ): View {
80104 return (parent.adapter as FragmentAdapter ? )!! .getChildViewAt(index)
81105 }
82106
83107 override fun removeView (parent : ViewPager2 , view : View ) {
84- (parent.adapter as FragmentAdapter ? )!! .removeFragment(view)
108+ (parent.adapter as FragmentAdapter ? )? .removeFragment(view)
85109
86110 // Required so ViewPager actually animates the removed view right away (otherwise
87111 // a white screen is shown until the next user interaction).
@@ -92,12 +116,12 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
92116 override fun removeAllViews (parent : ViewPager2 ) {
93117 parent.isUserInputEnabled = false
94118 val adapter = parent.adapter as FragmentAdapter ?
95- adapter!! .removeAll()
119+ adapter? .removeAll()
96120 }
97121
98122 override fun removeViewAt (parent : ViewPager2 , index : Int ) {
99123 val adapter = parent.adapter as FragmentAdapter ?
100- adapter!! .removeFragmentAt(index)
124+ adapter? .removeFragmentAt(index)
101125
102126 // Required so ViewPager actually animates the removed view right away (otherwise
103127 // a white screen is shown until the next user interaction).
0 commit comments