4. 사용자의 move 이벤트가 발생 시 현재 위치를 저장하는 position 객체를 생성하고 3과 같이 화면 중앙 값으로 초기 값을 저장합니다.
5. 내가 정의한 onPanResponderMove와 onPanResponderRelease 메서드를 PandResponder의 move, release 이벤트 함수로 사용할 수 있도록 정의하고 PanResponder.create에서 PandResponder의 이벤트 함수들과 사용자 정의 함수를 연결해줍니다.
* PanResponder를 생성 시 onStartShouldSetPanResponder에 true 값은 요소를 터치 할 때 지정한 move, release 함수가 활성화 됨을 의미 합니다.
6. _handlePanResponderMove (onPanResponderMove)의 로직을 만들어 줍니다.
객체가 사용자의 이동 이벤트를 받으면 evt와 gesture 파라미터를 받게 되는데 evt의 경우 객체내 터치 좌표, 연속된 이벤트의 배열 등 사용자 이벤트 자체 정보를 포함하는 반면 gesture의 경우 이벤트의 움직임과 관련 정보를 포함하고 있어 요번 예제에서는 gesture 정보를 사용합니다.
move 이벤트의 원점 - 이동된 점으로 이동한 거리를 계산하고
let ydiff = gestureState.y0 - gestureState.moveY
position의 y 값을 이동전 y 값 - 이동 값을 통해 move 이벤트의 이동 위치로 저장합니다.
y: this.state.oPosition.y - ydiff
7, _handlePanResponderRelease (onPanResponderRelease)에 release 이벤트가 발생 시 oPosition을 사용자가 객체를 드랍 했을 때의 위치로 저장하고 새로 이벤트를 받을 수 있도록 합니다.
- render에서는 scrollView를 통해 도시 목록을 보여주고 TouchableWithoutFeedback을 통해 선택한 도시로 이동
각 도시의 주요 장소를 추가하고 출력하는 City.js 추가
- navigationOptions에서 route 객체 반환을 위해 콜백 함수 이용
- addLocation method는 navigation param에서 도시 정보를 가져오고 screenProps의 addLocation을 호출하여 location을 추가
- render에서 도시의 location정보를 scrollView를 통해 출력하고 location을 추가할 수 있는 폼을 추가
손가락이 저릴 정도로 코드를 추가 했다. 실행해보자. 동작은 잘 되지 않는다. 인터페이스만 확인하자
*실행 시 에뮬레이터에서 아래와 같은 메세지와 함께 실행이 되지 않는다면 아래 빌드 터미널을 종료하고 다시 실행해보자.
invariant violation: module rcteventemitter is not a registered callable module (calling receivetouches) callfunctionreturnflushedqueue [native code]:0
실행 결과 화면
*에뮬레이터에서 경고 창 무시하기 react-native run-ios --varient-release 로 실행하면 됨.
데이터 유지하기(AsyncStorage)
앱이 종료된 뒤에도 입력한 데이터를 유지할 수 있도록 캐쉬 모듈을 사용합니다.
npm install @react-native-community/async-storage
위 명령어를 통해 AsyncStorage 모듈을 설치합니다. AsyncStorage는 안드로이드의 SharedPreference와 비슷하다고 보시면 됩니다.
*설치 후 아래와 같은 메세지와 함께 run-ios가 되지 않으면 프로젝트 내 ios폴더에서 pod install로 에뮬레이터에 모듈을 올려준다.
error Could not find the following native modules: RNCAsyncStorage. Did you forget to run "pod install" ?
CitiesApp.js
1. AsyncStorage를 import
2. 저장 key를 정의하고 componentDidMount 메서드에서 캐쉬된 데이터를 불러온다.
3. 데이터 갱신을 위해 addCity, addLocation 메서드에 JSON.stringify를 이용해 cities를 캐쉬 할 수 있도록 한다.
앱을 재실행 하여도 입력한 도시 정보가 유지된다.
이상으로 Navigation, Style적용 및 데이터 캐쉬를 위한 예제를 마무리 하였습니다.
어렵더라도 예제 코드를 이해하고 넘어 갈 수 있도록 합니다.
Tab navigation외 stack, drawer navigation이 있는데 찾아서 연습해 봅시다.