为什么不使用Android导航组件返回按钮

问题描述

这是我的身份验证活动

class AuthActivity : AppCompatActivity() {
    private lateinit var navController: NavController
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityAuthBinding.inflate(layoutInflater)
        setContentView(binding.root)

        navController = Navigation.findNavController(this,fragment.id)
        NavigationUI.setupActionBarWithNavController(this,navController)

    }

    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(navController,null)
    }

}

LoginFragment->如果登录成功,请转到“ AcceptCodeFragment”

 viewmodel.loginResponse.observe(viewLifecycleOwner,{ response ->
            viewBinding.pbLogin.visible(response is Resource.Loading)
            when (response) {
                is Resource.Success -> {
                    viewBinding.tvResponse.text = response.value.message
                    val action = LoginFragmentDirections.actionLoginFragmentToAcceptCodeFragment()
                    findNavController().navigate(action)
                }
                is Resource.Error -> if (response.isNetworkError) {
                    requireView().snackBar("Check your connection")
                } else {
                    requireView().snackBar(response.errorBody.toString())
                }
            }

AcceptCodeFragment后退按钮中的

不起作用。

使用相同的视图模型的两个片段。

解决方法

您的问题不是后退按钮不起作用,而是LiveData用于状态,而不是像loginResponse这样的事件。由于LiveData是用于事件的,因此当您返回自己的response时,它将重新使用先前的LoginFragment。然后,这会再次触发您的navigate()通话,将您直接推回到AcceptCodeFragment

根据LiveData with SnackBar,Navigation,and other events blog postLiveData不能直接用于事件。相反,您应该考虑使用事件包装器或其他解决方案(例如Kotlin Flow),这些解决方案只能将事件处理一次。