我要在我的应用程序中实现注册,在填写完相应的字段后,我单击一个按钮,该按钮将向API发出注册请求.同时,我放置了一个加载视图,当我收到成功的响应时,我执行到入网屏幕的导航.问题是,导航控制器总是运行导航并多次执行导航和弹出窗口,而实际上它应该只执行一次.我总是在日志(log)中收到这样的警告:Ignoring popBackStack to destination 29021787 as it was not found on the current back stack
,并且我无法在OnBoardingScreen中进行任何点击或聚焦.
我的代码是:
val uiState by registerViewModel.uiState.collectAsState()
when (uiState) {
is BaseViewState.Data -> {
navController.navigate(NavigationItem.OnBoarding.route) {
popUpTo(NavigationItem.Register.route) {
inclusive = true
}
}
}
is BaseViewState.Loading -> LoadingView()
is BaseViewState.Error -> BannerView()
else -> {}
}
在单击按钮时,我按如下方式调用viewModel:
registerViewModel.onTriggerEvent(
RegisterEvent.CreateUser(
usernameInputState.value.text,
emailInputState.value.text,
passwordInputState.value.text
)
)
并且,在ViewModel中,我这样做我的请求:
override fun onTriggerEvent(eventType: RegisterEvent) {
when (eventType) {
is RegisterEvent.CreateUser -> createUser(eventType.username, eventType.email, eventType.password)
}
}
private fun createUser(username: String, email: String, password: String) = safeLaunch {
setState(BaseViewState.Loading)
execute(createUser(CreateUser.Params(username, email, password))) {
setState(BaseViewState.Data(RegisterViewState(it)))
}
}
我猜这应该是由重新组合引起的,因为我首先在When Scenario上放置了一个断点,它多次停在这里,但只在ViewModel上放置了一个断点.我怎么才能解决这个问题呢?