React & React Native/오류노트

[RN/오류노트] Solved - ScrollView doesn't work on android, Switch Component not working Click

adjh54 2024. 12. 3. 20:00
반응형
해당 글에서는 ScrollView, Switch에서 발생하는 오류에 대해서 이를 해결한 방법에 대해 알아봅니다.

1) 문제점


💡 문제점

- 해당 문제점은 iOS 기기에서는 <ScrollView>로 구성한 부분이 수행이 되지만, Android 기기에서는 ScrollView가 동작하지 않아서 스크롤이 생기지 않는 문제점이 발생하였습니다.
- 또한, 두번째 문제로는 <Switch>로 구성한 부분에 대해 클릭이 되지 않는 문제가 발생하였습니다.

 

 

💡부모 컴포넌트

- 아래와 같이 부모 컴포넌트에서 자식 컴포넌트를 불러오는 구성입니다.
import { Text, View } from "react-native";
import ChildScreen from "./ChildScreens";

const ParentsScreen = () => {

    return (
        <View>
            <Text>부모 컴포넌트 영역입니다.</Text>

            {/* 자식 컴포넌트 호출  */}
            <ChildScreen></ChildScreen>
        </View>
    )

}
export default ParentsScreen;

 

 

💡 자식 컴포넌트

- 부모 컴포넌트에 의해 호출되는 자식 컴포넌트입니다.
- 해당 부분에서 Switch와 ScrollView를 사용하였을때 Switch는 눌리지 않는 문제점과 ScrollView는 안드로이드에서 움직이지 않는 문제가 발생하였습니다.
import { useState } from "react";
import { Platform, ScrollView, StyleSheet, Switch, Text, View } from "react-native";

const ChildScreen = () => {

    const [isSwitchOn, setIsSwitchOn] = useState(false);

    const toggleSwitch = () => {
        const switchToggle = !isSwitchOn
        setIsSwitchOn(switchToggle)
    }
    return (
        <View>
            <Text>자식 컴포넌트입니다.</Text>

            {/* ================================= 스위치 버튼 ============================================ */}
            <View>
                <Text >움직이면 쏜다</Text>
                <Switch
                    trackColor={{ false: '#767577', true: '#81b0ff' }}
                    thumbColor={isSwitchOn ? '#f5dd4b' : '#f4f3f4'}
                    ios_backgroundColor="#3e3e3e"
                    onValueChange={toggleSwitch}
                    value={isSwitchOn}
                />
            </View>

            {/* ================================= 스크롤뷰 영역 ============================================ */}
            <View>
                <ScrollView>
                    <View>
                        <Text>숫자 1</Text>
                        <Text>숫자 2</Text>
                        <Text>숫자 3</Text>
                        <Text>숫자 4</Text>
                        <Text>숫자 5</Text>
                        <Text>숫자 6</Text>
                        <Text>숫자 7</Text>
                        <Text>숫자 8</Text>
                        <Text>숫자 9</Text>
                        <Text>숫자 10</Text>
                    </View>
                </ScrollView>
            </View>
        </View>
    )
}
export default ChildScreen;

 

 

2) 해결방법


💡 해결방법

- 기존의 react-native 라이브러리 내에서 Switch, ScrollView를 import 해온 부분에 대해서 이를 react-native-gesture-handler 라이브러리 내에서 Switch, ScrollView를 불러와서 사용하도록 변경하여 해결하였습니다.

- react-native의 기본 ScrollView와 Switch는 플랫폼별로 네이티브 구현이 다르며, 특히 Android에서 터치 이벤트 처리가 일관되지 않을 수 있다고합니다.
- react-native-gesture-handler에서는 네이티브 플랫폼의 제스처 시스템에 직접 연결되어 더 나은 터치 처리 시스템을 제공하며 iOS와 Android 간의 일관된 터치 동작을 보장한다고 합니다.
// 변경 이전
import { Switch, ScrollView } from "react-native";

// 변경 이후 
import { Switch, ScrollView } from "react-native-gesture-handler";

 

 

 💡 아래의 이슈를 참고하고 확인하여 적용하였습니다.

https://github.com/facebook/react-native/issues/38730

 

반응형