TIL) 230406

Hanseul Lee·2023년 4월 6일
0

TIL

목록 보기
20/23

Parcelize와 Safe Args로 데이터 전달 꾸러미 만들기

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
}

Parcelize에서 list 활용하기

💡 Type is not directly supported by 'Parcelize'. Annotate the parameter type with '@RawValue' if you want it to be serialized using 'writeValue()'

Fragment를 이동하며 데이터를 보낼 일이 있어서 Parcelize를 사용하려 했는데 위와 같은 오류가 발생했다.

@Parcelize 어노테이션은 writeToParcel 함수를 생성할 때 자동으로 지원 가능한 타입들만 직렬화를 실행하기 때문이다. List, Map, Bundle 등과 같은 복합 타입을 직렬화하려고 할 때 이런 오류가 난다.

List<Message>를 직렬화하려면, Message 클래스도 직렬화가 가능한 상태여야 한다는 거다. 쉽게 말해서 Message도 다음과 같이 바꾸면 된다.

@Parcelize
data class Message(
    val message: String,
    val sendBy: Int
) : Parcelable

0개의 댓글