Исключение NullPointerException при привязке просмотра при возврате в firestore добавляет snapshotlistener

# #kotlin #android-fragments #google-cloud-firestore #kotlin-coroutines #android-viewbinding

Вопрос:

Я использую привязку просмотра в своем приложении, как рекомендует Google, я настраиваю его на фрагмент onCreateView и прикрепляю его к null onDestroyView, и он отлично работает, когда я перехожу от фрагмента A к фрагменту B и нажимаю кнопку «Назад» на фрагменте B, затем я успешно возвращаюсь к фрагменту A, но в другом случае я получил исключение NullPointerException при доступе к представлениям привязки просмотра позвольте мне объяснить этот случай:

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

    private fun saveItem(item: Item) = CoroutineScope(Dispatchers.IO).launch {
        try {
            itemCollectionRef.add(item).await()
            withContext(Dispatchers.Main) {
                findNavController().popBackStack()
            }
        } catch (e: Exception) {
           
        }
    } 
 

а на фрагменте А был метод, который подписывается на обновления в реальном времени, и вот он

  private fun subscribeToRealtimeUpdates() {
        itemCollectionRef.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
            firebaseFirestoreException?.let {
                Toast.makeText(requireActivity(), it.message, Toast.LENGTH_LONG).show()
                return@addSnapshotListener
            }
            val itemList: MutableList<Item> = mutableListOf()
            querySnapshot?.let {

                for (document in it) {
                    val item = document.toObject<Item>()
                    itemList.add(item)

                }
                if (itemList.isNotEmpty()) {
                    binding.loading.visibility = View.GONE // here the error 
                 
               
            }
        }
    }
    }
 

Я вызываю subscribeToRealtimeUpdates methon для фрагмента onViewCreated, и он отлично работает при первой загрузке и при возврате из фрагмента B, но выдает эту ошибку только при сохранении элемента в firestore.

когда я комментирую перестройку, ошибка исчезает, но я знаю, что это плохая практика, и это может привести к утечке памяти

 override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
 

here the whole error message

    java.lang.NullPointerException
        at FragmentA.getBinding(FragmentA.kt:34)
        at FragmentA.subscribeToRealtimeUpdates$lambda-3(FragmentA.kt:88)
        at FragmentA.lambda$RZjDeyOAZ3ZuXemIa8YOAw1hzG8(Unknown Source:0)
        at package.-$Lambda$FragmentA$RZjDeyOAZ3ZuXemIa8YOAw1hzG8.onEvent(Unknown Source:4)
        at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$2$Query(Query.java:1133)
        at com.google.firebase.firestore.-$Lambda$Query$JWhMgzcsIac1Z-exZj1pTDRisJg.onEvent(Unknown Source:6)
        at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0$AsyncEventListener(AsyncEventListener.java:42)
        at com.google.firebase.firestore.core.-$Lambda$AsyncEventListener$DNkggu2LY54oguDvcp-QtRg6Sfg.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7397)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
 

строка 34 ошибки private val binding get() = _binding!!
строка 88 ошибки binding.loading.visibility = View.GONE

итак, любое решение по поводу этой ошибки, кроме не уничтожающего объекта привязки просмотра на фрагменте onDestroyView