0

我在单个活动中有两个片段。单击按钮时,我设置了导致 api 调用的 api json 请求正文。在 api 成功响应应用程序移动到第二个片段。但是当我按下返回按钮时,片段 2 会重新加载,因为之前的实时数据成功值。

观察者被设置为监听 api 响应

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    binding.lifecycleOwner = viewLifecycleOwner
    super.onViewCreated(view, savedInstanceState)
    binding.phoneNumberViewModel = phoneNumberViewModel
    pref = getSharedPref()
    setToolbar()
    setApiObservers()
    setClickListeners()
}

这里触发 api 从 api 或 room 加载数据

override fun onClick(view: View?) {
    activity?.let {
        if (isAdded) {
            when (view?.id) {
                R.id.btn_sign_in -> {
                    checkPhoneNumber(getString(R.string.msisdn_with_code, phoneNumberViewModel.msisdn.get().toString())) // here triggering api
                }
            }
        }
    }
}

private fun checkPhoneNumber(phoneNumber: String) {
    phoneNumberViewModel.setCheckUserJSONBody(
        UserCheckJSONBody(
            getDeviceId(),
            phoneNumber,
            null
        )
    )
}

private fun setApiObservers() {
    setCheckUserApiObserver()
}

这里它监听 api 响应

private fun setCheckUserApiObserver() {
    binding.userCheckDbTable = phoneNumberViewModel.userCheckDbTable
    phoneNumberViewModel.userCheckDbTable?.observe(
        viewLifecycleOwner,
        Observer { userCheckResponseResource ->
            activity?.let { fragActivity ->
                if (isAdded) {
                    userCheckResponseResource?.let { nonNullUserCheckResponseResource ->
                        when (nonNullUserCheckResponseResource.status) {
                            Status.LOADING -> {
                            }
                            Status.SUCCESS -> {
                                pref?.setValue(Constants.PHONE_NUMBER, getString(R.string.msisdn_with_code, phoneNumberViewModel.msisdn.get().toString()))
                                navigateToLoginPinFragment()
                            }
                            Status.MSISDN_NOT_REGISTERED -> {
                                navigateToCreatePinFragment()
                            }
                            Status.INTERNET_CONNECTION_ERROR -> {
                                Toast.makeText(
                                    fragActivity,
                                    "internet connection error",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                            Status.INVALID_PARAMETERS -> {
                                Toast.makeText(
                                    fragActivity,
                                    "invalid pramams",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                            else -> {
                                nonNullUserCheckResponseResource.data?.let { repeatNecTransactionResponse3 ->
                                    repeatNecTransactionResponse3.errorMessage?.let { errorMessage ->
                                        Toast.makeText(
                                            fragActivity,
                                            errorMessage,
                                            Toast.LENGTH_SHORT
                                        ).show()
                                    } /*?: showMaintenanceErrorDialog()*/
                                } /*?: showMaintenanceErrorDialog()*/
                            }

                        }
                    }
                }
            }

        })
}

它在视图模型中标定如下:

 val userCheckDbTable: LiveData<Resource<UserCheckDBTable>>? =
    Transformations.switchMap(_fetchCheckUserJSONBody) { nonNullCheckUserJSONBody ->
        if (nonNullCheckUserJSONBody == null) {
            AbsentLiveData.create()
        } else {
            splashScreenRepository.callCheckUser(nonNullCheckUserJSONBody.getGson())
        }
    }
4

0 回答 0