안드로이드 Hilt 사용 시 java.lang.ClassCastException: dagger.hilt.android.internal.managers

이우건·2024년 2월 4일
0

안드로이드

목록 보기
10/20
post-thumbnail

문제

Hilt를 사용하여 프로젝트를 진행 중 이었는데 DatePicker 같은 component를 다른 클래스로 만들고 fragment에서 인스턴스를 만들어서 함수를 호출하는 과정에서 에러가 났다.

DatePickerHelper.kt

package com.gumibom.travelmaker.ui.main.findmate.meeting_post

import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import com.google.android.material.datepicker.MaterialDatePicker
import com.gumibom.travelmaker.constant.NO_DATE
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale

class DatePickerHelper(private val activity : FragmentActivity) {
    /**
     * DatePicker 생성 함수
     */
    fun pickDate(listener: (String) -> Unit) {
        val builder = MaterialDatePicker.Builder.datePicker()

        val today = Calendar.getInstance()
        builder.setSelection(today.timeInMillis)

        val datePicker = builder.build()


        datePicker.show(activity.supportFragmentManager, datePicker.toString())



        datePicker.addOnPositiveButtonClickListener { selectedDate ->

            // 선택된 날짜를 Calendar 객체로 변환
            val selectedCalendar = Calendar.getInstance()
            selectedCalendar.timeInMillis = selectedDate

            /*
                현재 날짜보다 과거를 선택하면 선택을 할 수 없다.
             */
            if (!selectedCalendar.after(today) || selectedCalendar.equals(today)) {
                Toast.makeText(activity, NO_DATE, Toast.LENGTH_SHORT).show()
                listener("")
            } else {
                val dateFormatter = SimpleDateFormat("yyyy-MM-dd", Locale.KOREA)
                val dateString = dateFormatter.format(Date(selectedDate))

                listener(dateString)
            }
        }
    }
}

Fragment.kt

@AndroidEntryPoint
class MeetingPostDateFragment : Fragment() {

    private var _binding: FragmentMeetingPostDateBinding? = null
    private val binding get() = _binding!!
    private lateinit var activity: MeetingPostActivity
    
    private lateinit var datePickerHelper: DatePickerHelper
    private lateinit var timePickerHelper: TimePickerHelper
    private lateinit var findMateSearchFragment : FindMateSearchFragment

    private val meetingPostViewModel : MeetingPostViewModel by activityViewModels()

    override fun onAttach(context: Context) {
        super.onAttach(context)
        activity = context as MeetingPostActivity
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentMeetingPostDateBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        datePickerHelper = DatePickerHelper(requireActivity())
        timePickerHelper = TimePickerHelper(requireActivity())
datePicker.show(activity.supportFragmentManager, datePicker.toString())

에서 처음에는 context as FragmentActivity.supportFragmet로 접근하였더니


에러가 발생하였는데 원인은 Hilt로 생성한 fragment의 context는 FragmentContextWrapper라는 상위 클래스로 인식하여 context의 타입을 명시해야 되는 것이다.

따라서 context가 필요한 class는 context로 생성자를 만드는 것이 아닌 FragmentActivity 같은 context로 명시를 해서 넘겨줘야 한다.

profile
머리가 나쁘면 기록이라도 잘하자

0개의 댓글