React-Native-Dropdown-Picker 스크롤 이슈 해결
시리즈 목차 보기2 / 3
이슈 배경
React-Native → 0.75.3
React-Native-Dropdown-Picker → 5.4.6
react-native-gesture-handler → 2.20.2
문제
단과 대학 및 학과 선택은 하나의 모달 내부에서 두 개의 Dropdown Picker를 사용해야했다.
이 때, iOS에서는 문제없이 적용이 됐고, Android 기준으로

문제 없는 ios

Android는 사범대학 밑으로 아무리 스크롤을 해도 넘어가지 않는다.
해결 시도
먼저 흔히 알려진 해결책부터 찾아봤다.
의외로 React-Native-Dropdown-Picker의 ScrollView에 대한 에러 레퍼런스를 많이 찾을 수 있었고 하나씩 해보기로 결정했다.
-
z-Index 조절
stylesheet가 아닌 Dropdown-Picker의 prop으로 zIndex를 조절해서 컴포넌트를 구성하면 스크롤 모드일 때 드롭다운의 요소들을 화면의 가장 앞에 배치되며 스크롤이 가능하다는 것이다.
→
실패: 이미npm사이트에서 해당 라이브러리의 prop을 확인했었고 이미 z-Index 값을 올바르게 설정해놨었다.혹시 몰라 더 높은 값으로 배치해보았지만 소용없었다.
-
react-native-gesture-handler라이브러리를 이용해 드롭다운을 감싸기드롭다운을
GestureHandlerRootView컴포넌트로 감싸서 사용자의 제스쳐를 인식하여 상하swiping을 감지하여 스크롤 될 수 있게 한다는 방법이었다.→
실패: 해당 문제는 사용자의 이벤트를 감지하지 못하는 문제가 아닌 것으로 보였다. -
Patch-Package를 이용해
React-Native-Dropdown-Picker패치하기마지막 방법은
Dropdown-Picker라이브러리를 직접 패치하는 것이었다.기존
Dropdown-Picker의ScrollView와FlatList는React-Native에서 가져오는데react-native-gesture-handler의FlatList와ScrollView로 변경하고 이 변경사항을 내 프로젝트에patch하는 것이다.변경 전
tsx//Project/node_modules/react-native-dropdown-picker/src/components/Picker.js import { TouchableOpacity, Text, Image, FlatList, TextInput, Dimensions, ScrollView, Modal, ActivityIndicator, BackHandler, Platform, StyleSheet, } from 'react-native';변경 후
tsx//Project/node_modules/react-native-dropdown-picker/src/components/Picker.js import { TouchableOpacity, Text, Image, TextInput, Dimensions, Modal, ActivityIndicator, BackHandler, Platform, StyleSheet, } from 'react-native'; import { FlatList, ScrollView } from 'react-native-gesture-handler';json//package.json "scripts" : { // other.. "postinstall": "patch-package" }bashnpm i patch-package npx patch-package react-native-dropdown-picker까지 해주게 되면

프로젝트 루트에
patches가 생성되고 이를git에 올리면 앞으로npm install마다 자동적으로 해당 라이브러리를 패치해준다.→
성공: 솔직히 될 줄 몰랐다.이 에러에 쓴 시간이 너무나 많았기 때문에 쓸 수 있는 모든 방법을 다 써보고 안된다면 직접 만들거나 다른 라이브러리를 채택해야겠다고 생각하고 해당 라이브러리 깃허브 레포에 있는 모든 스크롤 관련 이슈를 찾아보던 중 알 수 있었다.
node_modules를 건들며 에러를 해결한 적은 처음이다.더군다나 항상 라이브러리를 맹신하면 안된다는걸 알고는 있었지만, React-Native에서 가장 많이 쓰이는 드롭다운 관련 라이브러리이니 무의식적으로 설정 및 코드의 문제라고 생각했었다.
물론 해당 라이브러리가 스크롤 모드에서 무조건 에러를 내는 것은 아닐 것이다.
우리 서비스의 드롭다운은 모달 내부의 두개의 드롭다운이라는 특수한 상황이었기 때문에 그랬을 수도 있다.
이후에는 유명한 라이브러리라도 내 사용 조건에서 제대로 동작하는지 먼저 의심해보기로 했다.