-
Notifications
You must be signed in to change notification settings - Fork 3
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.xml에 Argument를 추가합니다.
- URI에 위와 같이 작성할 필요 없음
:core:model/local/navargs 에 구현
- BaseNavArgs
- 이 클래스를 상속받는 data class를 만들면 됩니다.
: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의 클래스 명을 전달해야 합니다.
- val 과 NonNull로 속성을 만들어야 합니다.
아래와 같이 사용합니다.
- 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()