Skip to content

Commit 0c65e4d

Browse files
authored
fix(android): set initial page natively (#407)
1 parent 94320e9 commit 0c65e4d

File tree

2 files changed

+35
-40
lines changed

2 files changed

+35
-40
lines changed

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

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,31 +52,37 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
5252
//https://github.com/callstack/react-native-viewpager/issues/183
5353
vp.isSaveEnabled = false
5454
eventDispatcher = reactContext.getNativeModule(UIManagerModule::class.java)!!.eventDispatcher
55-
vp.registerOnPageChangeCallback(object : OnPageChangeCallback() {
56-
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
57-
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
58-
eventDispatcher.dispatchEvent(
59-
PageScrollEvent(vp.id, position, positionOffset))
60-
}
6155

62-
override fun onPageSelected(position: Int) {
63-
super.onPageSelected(position)
64-
eventDispatcher.dispatchEvent(
65-
PageSelectedEvent(vp.id, position))
66-
}
56+
vp.post {
57+
vp.registerOnPageChangeCallback(object : OnPageChangeCallback() {
58+
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
59+
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
60+
eventDispatcher.dispatchEvent(
61+
PageScrollEvent(vp.id, position, positionOffset))
62+
}
6763

68-
override fun onPageScrollStateChanged(state: Int) {
69-
super.onPageScrollStateChanged(state)
70-
val pageScrollState: String = when (state) {
71-
ViewPager2.SCROLL_STATE_IDLE -> "idle"
72-
ViewPager2.SCROLL_STATE_DRAGGING -> "dragging"
73-
ViewPager2.SCROLL_STATE_SETTLING -> "settling"
74-
else -> throw IllegalStateException("Unsupported pageScrollState")
64+
override fun onPageSelected(position: Int) {
65+
super.onPageSelected(position)
66+
eventDispatcher.dispatchEvent(
67+
PageSelectedEvent(vp.id, position))
7568
}
76-
eventDispatcher.dispatchEvent(
77-
PageScrollStateChangedEvent(vp.id, pageScrollState))
78-
}
79-
})
69+
70+
override fun onPageScrollStateChanged(state: Int) {
71+
super.onPageScrollStateChanged(state)
72+
val pageScrollState: String = when (state) {
73+
ViewPager2.SCROLL_STATE_IDLE -> "idle"
74+
ViewPager2.SCROLL_STATE_DRAGGING -> "dragging"
75+
ViewPager2.SCROLL_STATE_SETTLING -> "settling"
76+
else -> throw IllegalStateException("Unsupported pageScrollState")
77+
}
78+
eventDispatcher.dispatchEvent(
79+
PageScrollStateChangedEvent(vp.id, pageScrollState))
80+
}
81+
})
82+
83+
eventDispatcher.dispatchEvent(PageSelectedEvent(vp.id, vp.currentItem))
84+
}
85+
8086
return vp
8187
}
8288

@@ -139,6 +145,13 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
139145
viewPager.isUserInputEnabled = value
140146
}
141147

148+
@ReactProp(name = "initialPage", defaultInt = 0)
149+
fun setInitialPage(viewPager: ViewPager2, value: Int) {
150+
viewPager.post {
151+
setCurrentItem(viewPager, value, false)
152+
}
153+
}
154+
142155
@ReactProp(name = "orientation")
143156
fun setOrientation(viewPager: ViewPager2, value: String) {
144157
viewPager.orientation = if (value == "vertical") ViewPager2.ORIENTATION_VERTICAL else ViewPager2.ORIENTATION_HORIZONTAL

src/PagerView.tsx

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -55,26 +55,8 @@ import { getViewManagerConfig, PagerViewViewManager } from './PagerViewNative';
5555

5656
export class PagerView extends React.Component<PagerViewProps> {
5757
private isScrolling = false;
58-
private animationFrameRequestId?: number;
5958
private PagerView = React.createRef<typeof PagerViewViewManager>();
6059

61-
componentWillUnmount() {
62-
if (this.animationFrameRequestId !== undefined) {
63-
cancelAnimationFrame(this.animationFrameRequestId);
64-
}
65-
}
66-
67-
componentDidMount() {
68-
// On iOS we do it directly on the native side
69-
if (Platform.OS === 'android' && this.props.initialPage !== undefined) {
70-
this.animationFrameRequestId = requestAnimationFrame(() => {
71-
if (this.props.initialPage !== undefined) {
72-
this.setPageWithoutAnimation(this.props.initialPage);
73-
}
74-
});
75-
}
76-
}
77-
7860
public getInnerViewNode = (): ReactElement => {
7961
return this.PagerView.current!.getInnerViewNode();
8062
};

0 commit comments

Comments
 (0)