[Android] Jetpack Navigation - Safe Args

유정현·2024년 1월 3일
0

SafeArgs를 활용해 대상 간 데이터를 주고 받을 수 있다

왜 Safe Args를 사용할까?

기존 fragment간 데이터 전달에서는 bundle을 사용했다.

arguments = Bundle().apply { 
	putString("KEY", "value")
}

하지만 bundle의 사용에는 몇 가지 단점이 있다.
1. bundled은 key-value의 형태로 구성되기 때문에 발신 시 key 값을 잘못 입력하면 데이터를 전달받지 못한다.
2. 발신자가 전달한 값의 타입과 수신자가 원하는 타입의 형태가 맞지 않는 경우 에러가 발생한다.
3. default value를 지정할 수 없다.

Safe Args 적용

  1. 최상위 build.gradle.kts 파일에 다음 classpath를 포함한다.
buildscript {
    repositories {
        google()
    }
    dependencies {
        val nav_version = "2.5.3"
        classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
    }
}
  1. Java와 Kotlin 혼합 모듈에 적합한 자바 언어 코드를 생성하기 위해 앱 또는 모듈의 build.gradle.kts 파일에 다음을 추가한다.
plugins {
    id("androidx.navigation.safeargs")
}

이제 Safe Args를 사용할 준비가 다 되었다.

  1. XXXDirections
    Safe Args 사용을 설정하면 action 작업이 발생하는 각 대상의 destination에 대해 클래스가 생성된다. 클래스의 이름은 발신자 + "Directions" 이다.
    다음은 BlankFragment에서 BlankFragment02로 데이터를 전달하려고 하기 때문에 BlankFragmentDirections 클래스를 사용한다.
// BlankFragment.kt
binding.firstButton.setOnClickListener {
	findNavController().navigate(BlankFragmentDirections.nextAction())
}
<fragment
        android:id="@+id/blankFragment02"
        android:name="com.example.navigationgraph.BlankFragment2"
        android:label="fragment_blank2"
        tools:layout="@layout/fragment_blank2">
        <argument
            android:name="blank_arg_number"
            app:argType="string"
            android:defaultValue="2"
            />
        <action
            android:id="@+id/before_action"
            app:destination="@+id/blankFragment"/>
    </fragment>

혹시나 build.gradle 파일을 groovy로 생성한 경우 다음 공식 문서를 참고하시면 좋을 것 같습니다.
https://developer.android.com/guide/navigation/use-graph/safe-args?hl=ko


참고 자료
https://developer.android.com/guide/navigation/use-graph/pass-data?hl=ko
https://www.kodeco.com/19327407-using-safe-args-with-the-android-navigation-component

0개의 댓글