Skip to content

navigateByDeepLink

junsungPark edited this page May 16, 2023 · 1 revision

구현 목적

딥링크 사용 시에도 Action으로 이동하는 것처럼 사용할 수 있게 하고자 합니다.

딥링크로 이동할 때는 "medilens://main/comments_nav".toUri() 를 사용해서 이동해야 합니다.

이를 통해 도착지 Fragment에 데이터를 전달하고자 하는 경우에는, "medilens://main/comments_nav?이름&나이&생년월일".toUri() 과 같이 URI에 데이터를 직접 입력해서 전달할 수 있습니다.

먼저 딥링크를 사용 하지 않을 때는 아래와 같이, 간편하게 전달이 가능합니다.

딥링크 사용없이 Action으로 Argument 전달하는 방법

// 출발 Fragment에서

val name = "이름"
val age = "5"

val action = StartFragmentDirections.medicineInfoAction(name, age)
v.findNavController().navigate(action)

// 도착 Fragment에서
val args: medicineInfoFragmentArgs by navArgs()

그러나 딥링크로는 위와 같이 StartFragmentDirections.medicineInfoAction(name, age) 와 같이 Argument를 넣어서 전달하는 편한 방식이 불가능합니다.

  • 기존 딥링크로 Argument전달 시에는
  • URI를 위와 같이 직접 다 작성해줘야 함
  • URI 입력 시 오타 있는 경우 무조건 오류 발생

딥링크로 Argument 전달하는 방법

// nav.xml 에서, 전달할 Argument를 아래와 같이 정의해야 합니다.

<argument
    android:name="name"
    android:defaultValue="이름"/>

<argument
    android:name="age"
    android:defaultValue="나이"/>

<deepLink app:uri="medilens://main/medicineinfo_nav?name={name}&age={age}" />

// 출발 Fragment에서
val name = "이름"
val age = "5"

"medilens://main/medicineinfo_nav?name=$name&age=$age".toUri()

// 도착 Fragment에서
val args: MedicineInfoFragmentArgs by navArgs()
  • 구현한 기능으로 딥링크 Argument 전달 시에는
    • URI에 위와 같이 작성할 필요 없음
      • "medilens://main/medicineinfo_nav" 만 작성하면 됩니다
    • nav.xml에 argument를 선언할 필요없음
      • BaseNavArgs를 상속받는 data class를 만들기 만 하면됩니다.
      • data class를 만들면 동적으로 nav.xmlArgument를 추가합니다.

구현 기록

:core:model/local/navargs 에 구현

  • BaseNavArgs
    • 이 클래스를 상속받는 data class를 만들면 됩니다.

사용 방법

1. 전달할 데이터 클래스 제작

:core:model 모듈에 생성합니다.

/**
 * 약 정보 화면으로 전달할 인자
 *
 * @property medicineName 약 이름
 * @property imgUrl 약 이미지 URL
 * @property entpName 약 제조사
 * @property itemSequence 약 품목기준코드
 */
data class MedicineInfoArgs(
    val medicineName: String, val imgUrl: String, val entpName: String, val itemSequence: String, val medicineEngName: String
) : BaseNavArgs(MedicineInfoArgs::class.java.name)

주의사항

  • 상속받는 data class를 만들었을때 BaseNavArgs 의 생성자에 MedicineInfoArgs::class.java.name 과 같이 data class의 클래스 명을 전달해야 합니다.
  • valNonNull로 속성을 만들어야 합니다.

2. navigateByDeepLink() 사용

아래와 같이 사용합니다.

  • navigateByDeepLink
  • NavController를 확장하는 함수입니다.
    • core/common/util/UriBuilder.kt
    • fun NavController.navigateByDeepLink(deepLinkUrl: String, parameter: BaseNavArgs)
  • @param deepLinkUrl DeepLink Url
  • @param parameter DeepLink에 들어갈 파라미터
// 출발 Fragment에서

activity?.findNavController(com.android.mediproject.core.common.R.id.fragmentContainerView)?
.navigateByDeepLink(
    "medilens://search/medicine/medicine_detail_nav",
    MedicineInfoArgs(
        medicineName = approvedMedicineItemDto.itemName,
        imgUrl = approvedMedicineItemDto.bigPrdtImgUrl ?: "",
        entpName = approvedMedicineItemDto.entpName ?: "",
        itemSequence = approvedMedicineItemDto.itemSeq ?: "",
        medicineEngName = approvedMedicineItemDto.itemEngName ?: ""
    )
)

// 도착지인 MedicineInfoFragment에서

private val nagArgs: MedicineInfoArgs by navArgs()