为什么不使用 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 post,LiveData
不能直接用于事件。相反,您应该考虑使用事件包装器或其他解决方案(例如 Kotlin Flow
),让您的事件只被处理一次。
这是我的授权 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 post,LiveData
不能直接用于事件。相反,您应该考虑使用事件包装器或其他解决方案(例如 Kotlin Flow
),让您的事件只被处理一次。