[Android] navigation safe args 사용하기
🙋♀️ safe args?
기존 fragment간 데이터를 전달할 때는 bundle을 사용했다. 하지만 bundle의 경우, 타입 안정성을 보장하지 않는다는 한계가 존재했다.
그래서 등장한 것이 navigation의 safe args이다!!
🙋♀️ 사용법?
사용법도 비교적 간단하니 빠르게 살펴보자!!
👀 필요한 플러그인 추가
//app level gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
id 'androidx.navigation.safeargs.kotlin' //⭐⭐⭐
}
//project level gradle
plugins {
id 'com.android.application' version '7.3.1' apply false
id 'com.android.library' version '7.3.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false
id 'androidx.navigation.safeargs.kotlin' version '2.5.3' apply false //⭐⭐⭐ 버전은 검색을 통해 최신 버전을 사용하면 된다!
}
👀 Parcelable 사용하기
데이터를 safe args를 사용해 전달할 때 정렬화가 이루어져야 한다.
이를 위해서는 Percelable을 사용한다. 이는 기존의 Serializable보다 빠르고, boiler plate 코드가 비교적 적다.
//app level gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
id 'androidx.navigation.safeargs.kotlin'
id 'kotlin-parcelize'//⭐⭐⭐
}
이제 전달하고자 하는 데이터 객체에 Percelable을 적용하면 된다!
@Parcelize
data class Person(
val uuid: Int?,
val favorite: Boolean,
...
val relation: String,
val birth: LocalDateTime,
val residence: String,
val score: Int?
): Parcelable
그렇다면 전달하기 위한 준비는 끝났다!! 이제는 직접 전달하고 값을 가져와 사용해보자!
👀 값 전달 및 사용
우선 navigation에 값이 전달될 fragment에 arguments를 등록해준다!
위와 같이 데이터 값의 이름을 정의하면 코드상에서 해당 이름을 통해 값에 접근할 수 있게 된다!
//값 전달
peopleListAdapter.setOnItemClickListener { person ->
val action = PeopleListFragmentDirections.actionFragmentPeopleListToFragmentPersonDetail(it)
findNavController().navigate(action)
}
//값 사용
private val args: PersonDetailFragmentArgs by navArgs<PersonDetailFragmentArgs>() //args 선언
personDetailViewModel.setPerson(args.person) // navGraph에서 정의한 이름으로 사용
🙇♀️ 부족한 부분이 있다면 말씀해주세요! 감사합니다!
📃참고
- 공식 문서
- 그 외
댓글남기기