为什么不使用 android 导航组件的后退按钮

Why not work back button with android navigation component

这是我的授权 Activity

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 用于事件,当您返回 LoginFragment 时,它会重新传送之前的 response。然后,这会再次触发您的 navigate() 调用,将您推回到 AcceptCodeFragment.

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