как получить обратный вызов между фрагментами в kotlin - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь получить обратный вызов от одного дочернего фрагмента к родительскому фрагменту в kotlin, а затем позже вызвать функцию в родительском фрагменте для управления другими раскладками внутри дочернего фрагмента.

Я знаю, как получить обратный вызов от фрагмента к действию и доступ к функции во фрагменте в обратном вызове, мы не можем сделать это в Kotlin из-за сопутствующих объектов.

Другой способ - передать контекст фрагмента дочернему фрагменту и реализовать интерфейс использует содержимое фрагмента в onAttach(), но я не могу передать контекст родительского фрагмента через конструктор, так как я использую фабричные методы c.

Любая помощь будет высоко оценена.

Детский фрагмент: DriverStatusFragment.kt

  companion object {
    @JvmStatic
    fun newInstance() =
        DriverStatusFragment().apply {
            arguments = Bundle().apply {
            }
        }
}

override fun onAttach(context: Context) {
    super.onAttach(context)

    if (context is OnCurrentOrderStatusChanged) {
        orderStatusChangedCallBack = context
    }
}

private fun handleUserOnlineStatus(isOnline: Boolean) {
    CustomPreferences.setBooleanPreference(context!!, PrefEntity.IS_ONLINE, isOnline)

    when (isOnline) {
        true -> {
            binding.idOnlineStatus.text = getString(R.string.online)
            binding.idOnlineStatusImage.setImageResource(R.drawable.circle_green)

            //testing:
            orderStatusChangedCallBack?.orderStatusChanged(CONSTANTS.NEW_ORDER)
        }
        false -> {
            binding.idOnlineStatus.text = getString(R.string.offline)
            binding.idOnlineStatusImage.setImageResource(R.drawable.circle_gray)
        }
    }
}

Родительский фрагмент: HomeFragment.kt

class HomeFragment : Fragment(), OnMapReadyCallback, OnCurrentOrderStatusChanged {

companion object {
    @JvmStatic
    fun newInstance() =
        HomeFragment().apply {
            arguments = Bundle().apply {
            }
        }
}

fun handleOrderStatus(status: String) {

    when (status) {
        CONSTANTS.IDLE -> {
            replaceFragment(
                DriverStatusFragment.newInstance(),
                DriverStatusFragment::class.java.simpleName
            )
        }

        CONSTANTS.NEW_ORDER -> {
            replaceFragment(
                NewOrderFragment.newInstance(false),
                NewOrderFragment::class.java.simpleName
            )
        }

        CONSTANTS.ORDER_ACCEPTED -> {
            replaceFragment(
                EnRouteFragment.newInstance(CONSTANTS.ORDER_ACCEPTED),
                EnRouteFragment::class.java.simpleName
            )
        }

        CONSTANTS.ARRIVED_AT_DROP_LOCATION -> {
            replaceFragment(
                OrderDeliveredFragment.newInstance(CONSTANTS.ARRIVED_AT_DROP_LOCATION),
                OrderDeliveredFragment::class.java.simpleName
            )
        }

        CONSTANTS.DELIVERED -> {
            replaceFragment(
                DriverStatusFragment.newInstance(),
                DriverStatusFragment::class.java.simpleName
            )
        }
    }


override fun onAttach(context: Context) {
    super.onAttach(context)
    this.context = context
}

**NOT RECEIVING CALLBACK HERE**

override fun orderStatusChanged(orderStatus: String) {
    CommonUtils.showToast(context!!, "REAched here")
    handleOrderStatus(orderStatus)
}



}
...