Jetpack Navigation: фрагмент не привязан к контексту - PullRequest
0 голосов
/ 09 ноября 2018

Я использую навигацию Jetpack из новейших компонентов архитектуры Android в моем приложении. В некоторых редких случаях я получаю следующее падение:

Fatal Exception: java.lang.IllegalStateException: Fragment NewOfferFragment{40b548a} not attached to a context.
   at android.support.v4.app.Fragment.requireContext(Fragment.java:609)
   at android.support.v4.app.Fragment.getResources(Fragment.java:7673)
   at com.abc.xyz.offer.owner.fragment.NewOfferFragment$onActivityCreated$2.onChanged(NewOfferFragment.kt:1089)
   at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
   at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
   at android.arch.lifecycle.LiveData.setValue(LiveData.java:282)
   at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
   at android.arch.lifecycle.Transformations$2$1.onChanged(Transformations.java:145)
   at android.arch.lifecycle.MediatorLiveData$Source.onChanged(MediatorLiveData.java:152)
   at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
   at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
   at android.arch.lifecycle.LiveData.setValue(LiveData.java:282)
   at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
   at com.abc.xyz.util.remoteUtils.NetworkBoundResource$fetchFromNetwork$2$2.com.abc.xyz.util.remoteUtils.Resource$Companion.error(NetworkBoundResource.kt:3019)
   at android.arch.lifecycle.MediatorLiveData$Source.onChanged(MediatorLiveData.java:152)
   at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
   at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:121)
   at android.arch.lifecycle.LiveData.access$000(LiveData.java:59)
   at android.arch.lifecycle.LiveData$ObserverWrapper.shouldBeActive(LiveData.java:416)
   at android.arch.lifecycle.LiveData.observeForever(LiveData.java:207)
   at android.arch.lifecycle.MediatorLiveData$Source.plug(MediatorLiveData.java:141)
   at android.arch.lifecycle.MediatorLiveData.addSource(MediatorLiveData.java:96)
   at com.abc.xyz.util.remoteUtils.NetworkBoundResource$fetchFromNetwork$2.onChanged(NetworkBoundResource.kt:1074)
   at android.arch.lifecycle.MediatorLiveData$Source.onChanged(MediatorLiveData.java:152)
   at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
   at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
   at android.arch.lifecycle.LiveData.setValue(LiveData.java:282)
   at android.arch.lifecycle.LiveData$1.run(LiveData.java:87)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:7325)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Ниже приведен код для onActivityCreated моего фрагмента:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProviders.of(this, viewModelFactory)[NewOfferViewModel::class.java]
    viewModel.init(offerId)

    binding?.let {
        it.viewModel = viewModel
        it.handler = RadioButtonHandler(this)
    }

    viewModel.result.observe(this, Observer {
        it?.let {
            binding.resource = it
            endProgress()

            Logger.o(Thread.currentThread(), it)
            when (it.status) {
                Status.SUCCESS -> {
                    Logger.i(Thread.currentThread(), it.message)
                    endProgress()
                    if (viewModel.shouldUpload)
                        navController().popBackStack()
                    viewModel.shouldUpload = false
                }

                Status.ERROR -> {
                    Logger.i(Thread.currentThread(), it.message)
                    endProgress()
                    navController().popBackStack()
                    viewModel.shouldUpload = false
                }

                Status.LOADING -> {
                    startProgress()
                }
            }
        }
    })
}

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

Спасибо.

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