问题描述
这是我的身份验证活动
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 post,LiveData
不能直接用于事件。相反,您应该考虑使用事件包装器或其他解决方案(例如Kotlin Flow
),这些解决方案只能将事件处理一次。