@@ -7,10 +7,12 @@ import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
7
7
import com.facebook.infer.annotation.Assertions
8
8
import com.facebook.react.bridge.ReadableArray
9
9
import com.facebook.react.common.MapBuilder
10
+ import com.facebook.react.bridge.LifecycleEventListener
10
11
import com.facebook.react.uimanager.PixelUtil
11
12
import com.facebook.react.uimanager.ThemedReactContext
12
13
import com.facebook.react.uimanager.UIManagerModule
13
14
import com.facebook.react.uimanager.ViewGroupManager
15
+ import com.facebook.react.uimanager.UIManagerHelper
14
16
import com.facebook.react.uimanager.annotations.ReactProp
15
17
import com.facebook.react.uimanager.events.EventDispatcher
16
18
import com.reactnativepagerview.event.PageScrollEvent
@@ -20,15 +22,32 @@ import com.reactnativepagerview.event.PageSelectedEvent
20
22
21
23
class PagerViewViewManager : ViewGroupManager <ViewPager2 >() {
22
24
private lateinit var eventDispatcher: EventDispatcher
25
+ private lateinit var lifecycleEventListener: LifecycleEventListener
26
+
23
27
24
28
override fun getName (): String {
25
29
return REACT_CLASS
26
30
}
27
31
32
+ fun createFragmentAdapter (reactContext : ThemedReactContext ): FragmentAdapter {
33
+ return FragmentAdapter ((reactContext.currentActivity as FragmentActivity ? )!! )
34
+ }
35
+
28
36
override fun createViewInstance (reactContext : ThemedReactContext ): ViewPager2 {
29
37
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);
32
51
// https://github.com/callstack/react-native-viewpager/issues/183
33
52
vp.isSaveEnabled = false
34
53
eventDispatcher = reactContext.getNativeModule(UIManagerModule ::class .java)!! .eventDispatcher
@@ -60,6 +79,11 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
60
79
return vp
61
80
}
62
81
82
+ override fun onDropViewInstance (view : ViewPager2 ) {
83
+ super .onDropViewInstance(view)
84
+ UIManagerHelper .getReactContext(view).removeLifecycleEventListener(lifecycleEventListener);
85
+ }
86
+
63
87
private fun setCurrentItem (view : ViewPager2 , selectedTab : Int , scrollSmooth : Boolean ) {
64
88
refreshViewChildrenLayout(view)
65
89
view.setCurrentItem(selectedTab, scrollSmooth)
@@ -69,19 +93,19 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
69
93
if (child == null ) {
70
94
return
71
95
}
72
- (parent.adapter as FragmentAdapter ? )!! .addFragment(child, index)
96
+ (parent.adapter as FragmentAdapter ? )? .addFragment(child, index)
73
97
}
74
98
75
99
override fun getChildCount (parent : ViewPager2 ): Int {
76
- return parent.adapter!! .itemCount
100
+ return parent? .adapter? .itemCount ? : 0 ;
77
101
}
78
102
79
103
override fun getChildAt (parent : ViewPager2 , index : Int ): View {
80
104
return (parent.adapter as FragmentAdapter ? )!! .getChildViewAt(index)
81
105
}
82
106
83
107
override fun removeView (parent : ViewPager2 , view : View ) {
84
- (parent.adapter as FragmentAdapter ? )!! .removeFragment(view)
108
+ (parent.adapter as FragmentAdapter ? )? .removeFragment(view)
85
109
86
110
// Required so ViewPager actually animates the removed view right away (otherwise
87
111
// a white screen is shown until the next user interaction).
@@ -92,12 +116,12 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
92
116
override fun removeAllViews (parent : ViewPager2 ) {
93
117
parent.isUserInputEnabled = false
94
118
val adapter = parent.adapter as FragmentAdapter ?
95
- adapter!! .removeAll()
119
+ adapter? .removeAll()
96
120
}
97
121
98
122
override fun removeViewAt (parent : ViewPager2 , index : Int ) {
99
123
val adapter = parent.adapter as FragmentAdapter ?
100
- adapter!! .removeFragmentAt(index)
124
+ adapter? .removeFragmentAt(index)
101
125
102
126
// Required so ViewPager actually animates the removed view right away (otherwise
103
127
// a white screen is shown until the next user interaction).
0 commit comments