React & React Native/라이브러리 활용

[RN] react-native 안드로이드 뒤로가기 버튼 방지 : BackHandler

adjh54 2023. 10. 16. 18:03
반응형
해당 글에서는 React-native 개발 환경 중 안드로이드 디바이스에 대해 뒤로 가기 버튼에 대해서 방지하는 방법에 대해 공유합니다.




1) BackHandler


💡 BackHandler

- Android 기기의 하드웨어 백 버튼을 처리하는 인터페이스를 제공하는 모듈입니다. 이 모듈을 사용하면 백 버튼 누름 이벤트를 감지하고 버튼이 눌렸을 때 사용자 정의 로직을 구현할 수 있습니다.

- react-native 설치 시 해당 모듈이 포함되어 있습니다.

 

💡 [참고] 해당 디바이스 화면에서 뒤로가기 버튼을 의미합니다.

 
 

2) BackHandler 활용


 

1. 라이브러리 가져오기


 

import { BackHandler } from 'react-native';

 
 
 

2. 이벤트 리스너 등록


💡 화면이 렌더링 된 이후 useEffect() 내에서 이벤트 리스너를 등록합니다.
import { useEffect, useInsertionEffect } from "react";
import { BackHandler, View } from "react-native";

const TestScreen = () => {

    useEffect(() => {

        BackHandler.addEventListener('hardwareBackPress', () => {
            // 백 버튼 누름을 처리하는 사용자 정의 로직
            // 기본 동작(예: 앱 종료)을 방지하려면 true를 반환
            // 기본 동작을 허용하려면 false를 반환
            return true;
        });

    }, []);

    return (
        <View>
            <Text>테스트 화면입니다.</Text>
        </View >

    )

}
export default TestScreen;

 
 
 
 

3. 이벤트 리스너 제거


💡 메모리 누수를 방지하기 위해 등록한 이벤트 리스너를 제거하는 단계입니다.
import { useEffect, useInsertionEffect } from "react";
import { BackHandler, Text, View } from "react-native";

const TestScreen = () => {

    useEffect(() => {

        BackHandler.addEventListener('hardwareBackPress', () => {
            // 백 버튼 누름을 처리하는 사용자 정의 로직
            // 기본 동작(예: 앱 종료)을 방지하려면 true를 반환
            // 기본 동작을 허용하려면 false를 반환
            return true;
        });
        return () => {
              // 이벤트 리스너 제거됨
            BackHandler.removeEventListener('hardwareBackPress', () => true);
        }

    }, []);

    return (
        <View>
            <Text>테스트 화면입니다.</Text>
        </View >

    )

}
export default TestScreen;

 
 
 

3) 공통 기능으로 구현하기


💡 [기능 설명]

- 공통 Util로 분리하여서 각각 뒤로가기 버튼을 방지해야 하는 페이지에 응용하면 도움이 될 것 같습니다.


1. useEffect()

- 화면이 렌더링된 이후 시점에 onPressBackBtn 함수를 호출합니다.
- true 인 경우 뒤로 가기 버튼을 방지합니다
- false 인 경우 뒤로 가기 버튼을 허용하여 뒤로 가기를 수행합니다.


2. onPressBackBtn()backAction() 함수를 구성합니다.

- true : 응답 값을 true로 반환합니다.
- false: 페이지를 이전 페이지로 이동시킵니다.


3. BackHandler.addEventListener()
- 뒤로가기 버튼 액션에 대해 이벤트 리스너를 등록합니다.
- 등록과 동시에 뒤로 가기 버튼을 누르면 onPressBackBtn() 함수를 호출합니다.


4. BackHandler.removeEventListener()

- 뒤로가기 버튼 액션 처리에 대해 이벤트 리스너를 제거합니다.
import { useNavigation } from "@react-navigation/native";
import { useEffect, useInsertionEffect } from "react";
import { BackHandler, View } from "react-native";

const TestScreen = () => {

    const navigation = useNavigation();

    useEffect(() => {

        onPressBackBtn(true);       // 뒤로가기 버튼을 방지합니다.
        // or
        onPressBackBtn(false);      // 뒤로가기 버튼 클릭 시 goBack() 함수로 이전 페이지로 이동합니다. 

    }, []);

    /**
     * 뒤로가기 버튼을 눌렀을때 처리되는 함수 
     * @param {boolean} action : true 일 경우 
     * @returns 
     */
    const onPressBackBtn = (action: boolean) => {

        const backAction = (): boolean => {
            // 파라미터가 true이면 뒤로가기 버튼을 방지합니다.
            if (action) {
                return action;
            }
            // 파라미터가 false이면 뒤로가기 버튼 시 실제 뒤로가기를 수행합니다. 
            else {
                navigation.goBack();
                return action;
            }
        }

        // BackHandler에 대해 이벤트 리스너를 등록합니다.
        BackHandler.addEventListener(
            'hardwareBackPress',
            backAction,
        );

        // BackHandler에 대해 이벤트 리스너를 제거합니다.
        return () => {
            BackHandler.removeEventListener('hardwareBackPress', backAction);
        }
    }

    return (
        <View>
            <Text>테스트 화면입니다.</Text>
        </View >

    )

}
export default TestScreen;

 
 
 
 
오늘도 감사합니다. 😀
 
 
 
 

반응형