为什么不使用android导航组件的“返回”按钮
这是我的Auth活动为什么不使用android导航组件的“返回”按钮,android,kotlin,navigation-architecture,Android,Kotlin,Navigation Architecture,这是我的Auth活动 class AuthActivity : AppCompatActivity() { private lateinit var navController: NavController override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ActivityAuthBinding.
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”
在AcceptCodeFragment中,返回按钮不工作
两个片段使用相同的viewmodel。您的问题不是后退按钮不起作用,而是
LiveData
用于状态,而不是像您的loginResponse
这样的事件。由于LiveData
用于事件,因此当您返回到LoginFragment
时,它会重新传递以前的响应。然后,这会再次触发您的navigate()
调用,将您推回到您的AcceptCodeFragment
根据说明,LiveData
不能直接用于事件。相反,您应该考虑使用事件包装器或另一个解决方案(例如Kotlin <代码>流>代码>),这允许您的事件只被处理一次。
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())
}
}