Проблема с NavController внутри OnBackPressedCallback - PullRequest
0 голосов
/ 18 июня 2019

Я получаю does not have a NavController set ошибку внутри OnBackPressedCallback. Вот код

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    fragmentView = inflater.inflate(R.layout.patient_info_fragment, container, false)

    if(Utils.connectedToInternet()){
        fragmentView.pastScreeningsButton.visibility = View.GONE
    }

    requireActivity().onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
                Navigation.findNavController(fragmentView).navigate(R.id.action_patientInfoFragment_to_patientsList)
        }
    })
    setHasOptionsMenu(true)


    return fragmentView
}

Я получаю эту ошибку, только когда возвращаюсь во фрагмент, где это реализовано.

У меня есть android:name="androidx.navigation.fragment.NavHostFragment" в домашнем фрагменте.

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

Дайте мне знать, если вам нужно больше увидеть мой код.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вы можете столкнуться с проблемой утечек старых экземпляров вашего фрагмента. Также не рекомендуется хранить созданное представление в другой переменной, такой как fragmentView. В целом ваша onCreateView реализация делает слишком много вещей, не связанных с ее целью.

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

class PatientInfoFragment: Fragment() {

    private val callback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            Navigation.findNavController(view).navigate(R.id.action_patientInfoFragment_to_patientsList)
        }
    }

    override fun onCreate(
        savedInstanceState: Bundle?
    ) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(R.layout.patient_info_fragment, container, false)

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?
    ) {
        if(Utils.connectedToInternet()){
            view.pastScreeningsButton.visibility = View.GONE
        }
    }

    override fun onStart() {
        super.onStart()
        requireActivity().onBackPressedDispatcher.addCallback(callback)
    }

    override fun onStop() {
        callback.remove()
        super.onStop()
    }
}

Привязка жизненного цикла обратного вызова может быть связана с фрагментом как владелец жизненного цикла, вызывая другой addCallback(LifecycleOwner, OnBackPressedCallback).

Кроме того, вы можете взглянуть на Android KTX и Kotlin Android Extensions , чтобы упростить вашу реализацию.

0 голосов
/ 18 июня 2019

Переместите свой код в onViewCreated и передайте view, предоставленный переопределенным методом:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        requireActivity().onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
                Navigation.findNavController(view).navigate(R.id.action_patientInfoFragment_to_patientsList)
        }
    })
    }

Если это также не работает, замените .navigate() на popBastack(R.id.framgment_where_you_want to go, false), если ваш предыдущий фрагмент остается на backStack

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...