Skip to content

Commit 18b9d77

Browse files
authored
fix(android): fix KotlinNullPointerException (#369)
* issue-352 [#352] *if activity not exist, create adapter when app resume work * *wip * *wip * *wip * *small fix
1 parent 9253575 commit 18b9d77

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

android/src/main/java/com/reactnativepagerview/PagerViewViewManager.kt

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
77
import com.facebook.infer.annotation.Assertions
88
import com.facebook.react.bridge.ReadableArray
99
import com.facebook.react.common.MapBuilder
10+
import com.facebook.react.bridge.LifecycleEventListener
1011
import com.facebook.react.uimanager.PixelUtil
1112
import com.facebook.react.uimanager.ThemedReactContext
1213
import com.facebook.react.uimanager.UIManagerModule
1314
import com.facebook.react.uimanager.ViewGroupManager
15+
import com.facebook.react.uimanager.UIManagerHelper
1416
import com.facebook.react.uimanager.annotations.ReactProp
1517
import com.facebook.react.uimanager.events.EventDispatcher
1618
import com.reactnativepagerview.event.PageScrollEvent
@@ -20,15 +22,32 @@ import com.reactnativepagerview.event.PageSelectedEvent
2022

2123
class 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

Comments
 (0)