Debbi Story

Navigation Component data전달하기 본문

안드로이드/Tip

Navigation Component data전달하기

Debbi 2020. 11. 10. 01:43
728x90

 

https://developer.android.com/guide/navigation/navigation-pass-data#supported_argument_types

위에 공식 문서에서 data를 전달 할 수 있는 타입을 확인하시고

 

<fragment
    android:id="@+id/detailFragment"
    android:name="com.example.app.detailFragment"
    android:label="detailFragment" >
    <argument
        android:name="data"
        app:argType="com.example.app.detailFragment.UserInfo[]"/>
</fragment>

 

이런식으로 data를 전달 받을 fragment에 argument 태그로 추가해줍니다.

사용자정의 타입도 전달 할 수 있고 Array타입으로도 넘길 수 있습니다. 

 

@Parcelize
data class UserInfo(
    val name: String,
    val age: Int
): Parcelable

 

사용자정의 타입을 사용할 경우 Parcelable나 Serializable를 구현해야 합니다. 이전에는 Parcelable를 구현하려면 코드가길어지고 복잡했지만 @Parcelize 어노테이션이 코틀린에서 제공해주므로 간단하게 구현이 가능합니다!

 

그리고 만약 data가 List타입일때 

@Suppress("UNCHECKED_CAST")
public actual inline fun <reified T> Collection<T>.toTypedArray(): Array<T> {
    @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
    val thisCollection = this as java.util.Collection<T>
    return thisCollection.toArray(arrayOfNulls<T>(0)) as Array<T>
}

Array로 바꿔주는 toTypedArray 확장 함수가 있습니다!

 

val args: ConfirmationFragmentArgs by navArgs()

 

마지막으로 fragment에서 argument를 가져오는 방법입니다. dependencies 추가도 잊지 말아주세요

 

dependencies {
  def nav_version = "2.3.1"

  // Java language implementation
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

  // Feature module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:1.0.0-alpha01"
}