• Stars
    star
    2,475
  • Rank 17,853 (Top 0.4 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 5 years ago
  • Updated 22 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

React Native wrapper for the Android ViewPager and iOS UIPageViewController.

react-native-pager-view ViewPager

npm package Lean Core Extracted License

Lint iOS Build Android Build

This component allows the user to swipe left and right through pages of data. Under the hood it is using the native Android ViewPager and the iOS UIPageViewController implementations. See it in action!


ViewPager


Versions

4.x 5.x
iOS iOS support
ViewPager1 ViewPager2

New architecture support (Fabric)

This library supports both architectures (Paper and Fabric). If you would like enable new architecture, please run below command:

yarn add react-native-pager-view@newarch

Migration

In version 6.x support for transitionStyle property has been dropped. More information here.

"@react-native-community/viewpager" library has been changed to react-native-pager-view. Here you can find more information, how to migrate pager view to the latest version

Getting started

yarn add react-native-pager-view

New architecture setup (Fabric)

This library supports new architecture! We have two example folders one for each architecture. If you are using this library in your own project there some extra steps needed.

iOS

Install pods with this flag inside ios folder:

RCT_NEW_ARCH_ENABLED=1 bundle exec pod install

(Inside of fabricexample the RCT_NEW_ARCH_ENABLED is already set to true by default inside Podfile)

Android

Set newArchEnabled to true inside android/gradle.properties (this flag is already set to true in fabricexample) and then run:

yarn android

If you have issues with running android build you can try to generate codegen before the build using this command:

cd android && ./gradlew generateCodegenArtifactsFromSchema

Linking

>= 0.60

Autolinking will just do the job.

< 0.60

Mostly automatic

react-native link react-native-pager-view

Manual linking

Manually link the library on iOS

Follow the instructions in the React Native documentation to manually link the framework or link using Cocoapods by adding this to your Podfile:

pod 'react-native-pager-view', :path => '../node_modules/react-native-pager-view'
Manually link the library on Android
Make the following changes:

android/settings.gradle

include ':react-native-pager-view'
project(':react-native-pager-view').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-pager-view/android')

android/app/build.gradle

dependencies {
   ...
   implementation project(':react-native-pager-view')
}

android/app/src/main/.../MainApplication.java

On top, where imports are:

Add import com.reactnativepagerview.PagerViewPackage;

Add the PagerViewPackage class to your list of exported packages.

@Override
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
    new MainReactPackage(),
    new PagerViewPackage()
  );
}

Usage

import React from 'react';
import { StyleSheet, View, Text } from 'react-native';
import PagerView from 'react-native-pager-view';

const MyPager = () => {
  return (
    <PagerView style={styles.pagerView} initialPage={0}>
      <View key="1">
        <Text>First page</Text>
      </View>
      <View key="2">
        <Text>Second page</Text>
      </View>
    </PagerView>
  );
};

const styles = StyleSheet.create({
  pagerView: {
    flex: 1,
  },
});

Attention: Note that you can only use View components as children of PagerView (cf. folder /example) . For Android if View has own children, set prop collapsable to false https://reactnative.dev/docs/view#collapsable-android, otherwise react-native might remove those children views and and its children will be rendered as separate pages

Advanced usage

For advanced usage please take a look into our example project

API

Prop Description Platform
initialPage Index of initial page that should be selected both
scrollEnabled: boolean Should pager view scroll, when scroll enabled both
onPageScroll: (e: PageScrollEvent) => void Executed when transitioning between pages (ether because the animation for the requested page has changed or when the user is swiping/dragging between pages) both
onPageScrollStateChanged: (e: PageScrollStateChangedEvent) => void Function called when the page scrolling state has changed both
onPageSelected: (e: PageSelectedEvent) => void This callback will be called once the ViewPager finishes navigating to the selected page both
pageMargin: number Blank space to be shown between pages both
keyboardDismissMode: ('none' / 'on-drag') Determines whether the keyboard gets dismissed in response to a drag both
orientation: Orientation Set horizontal or vertical scrolling orientation (it does not work dynamically) both
overScrollMode: OverScollMode Used to override default value of overScroll mode. Can be auto, always or never. Defaults to auto Android
offscreenPageLimit: number Set the number of pages that should be retained to either side of the currently visible page(s). Pages beyond this limit will be recreated from the adapter when needed. Defaults to RecyclerView's caching strategy. The given value must either be larger than 0. Android
overdrag: boolean Allows for overscrolling after reaching the end or very beginning or pages. Defaults to false iOS
layoutDirection: ('ltr' / 'rtl' / 'locale') Specifies layout direction. Use ltr or rtl to set explicitly or locale to deduce from the default language script of a locale. Defaults to locale both
Method Description Platform
setPage(index: number) Function to scroll to a specific page in the PagerView. Invalid index is ignored. both
setPageWithoutAnimation(index: number) Function to scroll to a specific page in the PagerView. Invalid index is ignored. both
setScrollEnabled(scrollEnabled: boolean) A helper function to enable/disable scroll imperatively. The recommended way is using the scrollEnabled prop, however, there might be a case where a imperative solution is more useful (e.g. for not blocking an animation) both

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

Known Issues

  • flex:1 does not work for child views, please use width: '100%', height: '100%' instead

  • [iOS]: In case of UIViewControllerHierarchyInconsistency error, please use below fix:

requestAnimationFrame(() => refPagerView.current?.setPage(index));

Preview

Android

horizontal vertical
ViewPager ViewPager

iOS

horizontal vertical
ViewPager ViewPager

Reanimated onPageScroll handler

An example can be found here

Instructions

To attach reanimated handler with onPageScroll follow the below steps.

// 1. Define the handler
function usePageScrollHandler(handlers, dependencies) {
  const {context, doDependenciesDiffer} = useHandler(handlers, dependencies);
  const subscribeForEvents = ['onPageScroll'];

  return useEvent(
    event => {
      'worklet';
      const {onPageScroll} = handlers;
      if (onPageScroll && event.eventName.endsWith('onPageScroll')) {
        onPageScroll(event, context);
      }
    },
    subscribeForEvents,
    doDependenciesDiffer,
  );
}
  
// 2. Attach the event handler
import PagerView from "react-native-pager-view";
import Animated from "react-native-reanimated";
const AnimatedPagerView = Animated.createAnimatedComponent(PagerView);

const pageScrollHandler = usePageScrollHandler({
    onPageScroll: e => {
      'worklet';
      offset.value = e.offset;
      console.log(e.offset, e.position);
    },
});

<AnimatedPagerView onPageScroll={pageScrollHandler}/>

License

MIT

More Repositories

1

react-native-paper

Material Design for React Native (Android & iOS)
TypeScript
12,242
star
2

linaria

Zero-runtime CSS in JS library
TypeScript
11,195
star
3

haul

Haul is a command line tool for developing React Native apps, powered by Webpack
TypeScript
3,637
star
4

react-native-testing-library

πŸ¦‰ Simple and complete React Native testing utilities that encourage good testing practices.
TypeScript
2,970
star
5

react-native-builder-bob

πŸ‘·β€β™‚οΈ Simple set of CLIs to scaffold and build React Native libraries for different targets
JavaScript
2,637
star
6

repack

A Webpack-based toolkit to build your React Native application with full support of Webpack ecosystem.
TypeScript
1,330
star
7

react-native-slider

React Native component exposing Slider from iOS and SeekBar from Android
TypeScript
1,118
star
8

reassure

Performance testing companion for React and React Native
TypeScript
1,109
star
9

react-native-ios-kit

The missing React Native UI Kit for iOS
JavaScript
519
star
10

react-theme-provider

A set of utilities that help you create your own React theming system in few easy steps
JavaScript
459
star
11

react-native-fbads

Facebook Audience SDK integration for React Native
Java
434
star
12

super-app-showcase

Monorepository template for super app development with React Native and Re.Pack
JavaScript
352
star
13

react-native-image-editor

A library providing an API for cropping images from the web and the local file system.
Kotlin
340
star
14

react-native-paper-login-template

The easiest way to start with your application.
TypeScript
239
star
15

react-native-brownfield

Set of helpers to make your brownfield integration smooth and easy.
Kotlin
207
star
16

react-native-opentok

React Native OpenTok
Objective-C
203
star
17

component-docs

πŸ“ Simple documentation for your React components
TypeScript
137
star
18

react-native-open-source-board

OSS board with triaged React Native issues.
126
star
19

async-storage

Cross platform storage for React, built on top of AsyncStorage
JavaScript
109
star
20

react-native-material-palette

Bringing Material Palette API to React Native
JavaScript
105
star
21

ts-regex-builder

Maintainable regular expressions for TypeScript and JavaScript.
TypeScript
83
star
22

react-native-multibundle

JavaScript
57
star
23

eslint-config-callstack

ESLint preset extending Flow, Prettier and Jest
JavaScript
52
star
24

repack-examples

Repository with examples for Re.Pack
Java
40
star
25

ai-meeting-transcription

AI Tool for meeting transcriptions
Jupyter Notebook
36
star
26

react-native-socket-mobile

React Native module for the Socket Mobile SDK.
JavaScript
35
star
27

fabric-library-with-custom-cpp-example

Add custom cpp state to your fabric library
Java
29
star
28

hapi-graphql-boilerplate

JavaScript
26
star
29

react-native-detox-example

Example integration of Detox and Jest
Objective-C
23
star
30

super-app-example

This repository presents a compact super-app example from Callstack's blog, illustrating the use of a monorepo structure together with Re.Pack and Module Federation.
Java
21
star
31

web3-react-native-dapp-wagmi

TypeScript
20
star
32

linaria-styled

Zero-runtime CSS in JS library for building React components
18
star
33

parcel-plugin-linaria

Parcel plugin for Linaria (Experimental)
JavaScript
17
star
34

benz-ql

GraphQL server for the Mercedes APIs
JavaScript
16
star
35

generator-node-module

A Yeoman module to author Node libraries with Prettier, Jest, Flow and Babel.
JavaScript
16
star
36

react-native-snapshot-tests

An example of snapshot testing with React Native
Objective-C
16
star
37

delightful-ux-training-app

JavaScript
15
star
38

web3-cross-platform-dapp

TypeScript
13
star
39

universal-react-app

JavaScript
12
star
40

workshop-navigation

Navigation in React Native workshop.
JavaScript
12
star
41

ai-cli

AI assistant in your terminal.
TypeScript
11
star
42

react-native-windows-hello

RNW library providing developer with all Windows Hello features
C++
10
star
43

github-comment-bot

JavaScript
10
star
44

talk-universal-react

JavaScript
8
star
45

news-mini-app-showcase

JavaScript
8
star
46

ReactNativeNotes

Notes demo application showing the abilities of React Native for desktop connected with UWP development
TypeScript
8
star
47

ai-summarization

AI summarization tool
Jupyter Notebook
7
star
48

react-native-releases-script

Script to generate changelog for RN releases
7
star
49

callstack-hackathon-team-ferran

callstack-hackaton-team-ferran
JavaScript
5
star
50

web3-react-native-dapp-viem

TypeScript
4
star
51

callstack-hackathon-team-dratwa-wojtek

JavaScript
3
star
52

reassure-examples

Examples for Reassure setup with different frameworks.
JavaScript
3
star
53

.github

Templates for all Callstack OSS projects
2
star
54

react-native-paper-codemod

JavaScript
2
star
55

AppleVisionBGFX

Usage of BGFX in visionOS
C++
2
star
56

callstack.github.io

Organisation Github Page
HTML
1
star
57

sample-weather-app

JavaScript
1
star
58

workshop-universal-sunshine

Universal React Native & React app based on Sunshine: https://github.com/udacity/Sunshine-Version-2
1
star