ganghee / Android_Pattern

Repository, MVP, MVVM, AAC, Koin
0 stars 0 forks source link

3-2 Fragment를 생성할 때 파라미터에 데이터를 전송하지 않고 bundle로 데이터 전송하는 방법이 있을까? #11

Closed ganghee closed 5 years ago

ganghee commented 5 years ago

ViewPagerAdapter.kt

override fun getItem(p0: Int): Fragment {     
        return when (p0) {  
            0 -> UpbitFragment("KRW")      
            1 -> UpbitFragment("BTC")   
            2 -> UpbitFragment("ETH")    
            3 -> UpbitFragment("USDT")  
            else -> null    
        }!! 
    }
ganghee commented 5 years ago

ViewPagerAdapter.kt

private val marketList = listOf("KRW", "BTC", "ETH", "USDT")
override fun getItem(position: Int): Fragment = 
   UpbitFragment.newInstance(marketList[position])

UpbitFragment.kt

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val firstMarket = arguments?.getString(MARKET_NAME)
        ...
}

companion object {
        const val MARKET_NAME = "market name"
        fun newInstance(marketName: String): UpbitFragment {
            val fragment = UpbitFragment()
            val bundle = Bundle()

            bundle.putString(MARKET_NAME, marketName)
            fragment.arguments = bundle
            return fragment
        }
    }

Fragment에서 파라미터를 삭제하고 인스턴스에 파라미터를 넣어주는 방식으로 바꾸었다. mainAcitvity에서 ViewPagerAdapter를 호출하게 되면 ViewPagerAdapter는 newInstance를 통해 Fragment를 생성한다. newInstance함수를 통해 객체가 생성되는 팩토리 패턴이다. 이 때 bundle객체에 데이터를 주고 받음으로 파라미터를 줄이거나 삭제할 수 있다. 이렇게 한 이유는 객체에 생성자를 구현하게 되면 의존성이 생겨 재활용하기 어렵다.

Fragment를 여러번 만드는 것이랑 함수를 통해 객체를 여러 개 만드는 것이 같은 로직이지만 객체지향의 관점으로 생각하면 하나의 객체를 재활용 즉, 함수를 통해 객체를 여러개 생성하는 로직이 더 클린한 코드이다.