Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android mvvm+;实时数据,由于以前的实时数据值而重新加载相同的片段_Android_Mvvm_Android Livedata - Fatal编程技术网

Android mvvm+;实时数据,由于以前的实时数据值而重新加载相同的片段

Android mvvm+;实时数据,由于以前的实时数据值而重新加载相同的片段,android,mvvm,android-livedata,Android,Mvvm,Android Livedata,我在一个活动中有两个片段。在单击按钮时,我设置了导致api调用的api json请求体。在api成功响应时,应用程序移动到第二个片段。但当我按下后退按钮时,由于之前的live data success值,fragment 2会重新加载 观察员被设置为监听api响应 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { binding.lifecycleOwner = viewLifecycleOwner

我在一个活动中有两个片段。在单击按钮时,我设置了导致api调用的api json请求体。在api成功响应时,应用程序移动到第二个片段。但当我按下后退按钮时,由于之前的live data success值,fragment 2会重新加载

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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    binding.lifecycleOwner = viewLifecycleOwner
    super.onViewCreated(view, savedInstanceState)
    binding.phoneNumberViewModel = phoneNumberViewModel
    pref = getSharedPref()
    setToolbar()
    setApiObservers()
    setClickListeners()
}
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()*/
                            }

                        }
                    }
                }
            }

        })
}
这里触发api从api或文件室加载数据

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响应

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    binding.lifecycleOwner = viewLifecycleOwner
    super.onViewCreated(view, savedInstanceState)
    binding.phoneNumberViewModel = phoneNumberViewModel
    pref = getSharedPref()
    setToolbar()
    setApiObservers()
    setClickListeners()
}
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())
        }
    }
val userCheckDbTable:LiveData=
switchMap(_fetchCheckUserJSONBody){nonNullCheckUserJSONBody->
if(nonNullCheckUserJSONBody==null){
AbsentLiveData.create()
}否则{
splashScreenRepository.callCheckUser(非NullCheckUserJSonBody.getGson())
}
}

当API调用成功时,必须有一个侦听器才能从Fragment1移动到Fragment2。要么在片段转换后注销侦听器,要么使用单一时间更新方法。发布进一步澄清的代码编辑我的问题。您可以检查什么是“userCheckDbTable”?给出它的数据类型以及在哪里声明?(我想是在视图模型中)是在视图模型中