Как не вызывать функцию при возврате из другого фрагмента Android Kotlin

#android #kotlin #android-fragments #navigation

Вопрос:

У меня есть фрагмент, содержащий обзор вторичной переработки. В этом фрагменте я делаю вызов, чтобы получить данные из API, а затем отобразить данные в recyclerview. Я вызываю метод, чтобы получить данные в методе onViewCreated. Когда я нажимаю на элемент из списка, открывается фрагмент карты и отображается местоположение этого элемента. Теперь, когда я нажимаю кнопку «Назад», я не хочу, чтобы метод получения данных вызывался снова. Есть какие-нибудь предложения о том, как я могу это сделать? Может быть, это простое решение, но я не могу его понять. Спасибо

Фрагмент списка:

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val backBtn: AppCompatImageView = requireActivity().findViewById(R.id.back_btn)
    backBtn.visibility = View.GONE
   

    binding.swipeRefreshMeteors.setOnRefreshListener {
        binding.swipeRefreshMeteors.isRefreshing = false
        getMeteorsDetails()
    }

    getMeteorsDetails()
    observeIsLoading()
    observeMeteorsData()
}

private fun getMeteorsDetails(){
    meteorsViewmodel.getMeteorsData()
}
 

Фрагмент карты

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val backBtn: AppCompatImageView = requireActivity().findViewById(R.id.back_btn)
    backBtn.visibility = View.VISIBLE
    backBtn.setOnClickListener {
        findNavController().navigateUp()
    }

    val meteorName = arguments?.getString("meteor_name")
    val meteorLat = arguments?.getString("meteor_lat")
    val meteorLong = arguments?.getString("meteor_long")
    val meteorFallenYear = arguments?.getString("meteor_fallen_year")
    supportMapFragment = childFragmentManager.findFragmentById(R.id.google_map) as SupportMapFragment

    supportMapFragment.getMapAsync { googleMap ->
        val meteorLocation = LatLng(meteorLat!!.toDouble(), meteorLong!!.toDouble())
        googleMap.addMarker(MarkerOptions().position(meteorLocation).title(meteorName).snippet(
                    "Year: $meteorFallenYear"
        ).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)))!!.showInfoWindow()
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(meteorLocation, 10f))
        //googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(meteorLocation, 10f))
    }
}
 

Модель представления

  val getMeteorsResponse: LiveData<Resource<ArrayList<MeteorModel>>?>
    get() = _getMeteorsResponse
private val _getMeteorsResponse = MutableLiveData<Resource<ArrayList<MeteorModel>>?>()

val isLoading: LiveData<Boolean>
    get() = _isLoading
private val _isLoading = MutableLiveData(false)

fun getMeteorsData(){
    _isLoading.value = true
    disposable.add(
        meteorsRepository.getMeteors()
            .subscribeOn(Schedulers.newThread())
            .observeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread())
            .subscribeWith(object : DisposableSingleObserver<ArrayList<MeteorModel>>(){
                override fun onSuccess(response : ArrayList<MeteorModel>) {
                    _isLoading.value = false
                    _getMeteorsResponse.value = Resource.success(response)
                }

                override fun onError(e: Throwable) {
                    _isLoading.value = false
                    _getMeteorsResponse.value = Resource.error(e.message ?: "Error", null)
                    Log.e(TAG, e.message.toString())
                }

            })
    )
}

fun resetMeteors(){
        _getMeteorsResponse.value = null
}
 

Комментарии:

1. Используйте a ViewModel и выполните вызов API внутри init ViewModel .

2. Я использую Viewmodel, я обновляю вопрос с помощью кода viewmodel, не могли бы вы, пожалуйста, взглянуть и привести мне пример? Спасибо

3. @OhhhThatVarun Я обновил вопрос

4. Мне нет смысла тебе это объяснять. Читать это

Ответ №1:

Используйте onBackPressed() в фрагменте карты для нажатия кнопки «Назад».

Попробуйте catchIn() использовать функцию для ваших данных ответа в модели представления.