0

这是我的身份验证活动

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 返回按钮不起作用。

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

4

1 回答 1

3

您的问题不在于后退按钮不起作用,而是LiveData针对state,而不是针对您的loginResponse. 对于LiveData事件,response当您返回到您的LoginFragment. 然后这会再次触发您的navigate()呼叫,将您推回到您的AcceptCodeFragment.

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

于 2020-10-07T19:09:40.203 回答