plugin을 추가한다.
// Parcelize
plugins {
id 'kotlin-parcelize'
}
// Safe Args
// 앱 단
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
// 프로젝트 단
buildscript {
ext {
nav_version = "2.5.3"
}
dependencies {
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
}
}
Fragment끼리 전달하기 위해 꾸러미처럼 만들 데이터 클래스에 @Parcelize
주석을 추가한다.
import kotlinx.parcelize.Parcelize
@Parcelize
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int,
val firstName: String,
val lastName: String,
val age: Int
): Parcelable
navigation graph에서 데이터를 전달 받은 목적 fragment에 매개변수를 추가한다.
출발 fragment에서 Safe Args로 데이터를 보낸다.
container.setOnClickListener {
val action = ListFragmentDirections.actionListFragmentToUpdateFragment(currentItem)
it.findNavController().navigate(action)
}
데이터를 전달 받을 목적 fragment에서 다음과 같이 설정한다.
private val args by navArgs<UpdateFragmentArgs>() // 데이터를 받는 변수
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentUpdateBinding.inflate(inflater, container, false)
val view = binding
binding.updateFirstNameEt.setText(args.currentUser.firstName)
binding.updateLastNameEt.setText(args.currentUser.lastName)
binding.updateAgeEt.setText(args.currentUser.age)
return view.root
}
Fragment를 이동하며 데이터를 보낼 일이 있어서 Parcelize를 사용하려 했는데 위와 같은 오류가 발생했다.
@Parcelize
어노테이션은 writeToParcel
함수를 생성할 때 자동으로 지원 가능한 타입들만 직렬화를 실행하기 때문이다. List
, Map
, Bundle
등과 같은 복합 타입을 직렬화하려고 할 때 이런 오류가 난다.
List<Message>
를 직렬화하려면, Message
클래스도 직렬화가 가능한 상태여야 한다는 거다. 쉽게 말해서 Message
도 다음과 같이 바꾸면 된다.
@Parcelize
data class Message(
val message: String,
val sendBy: Int
) : Parcelable