# #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