Вы заменяете AuthView
на LoadingView
, а затем LoadingView
на MainView
в том же импульсе, так что это не даст вам того, что вы хотите.Обычно вы хотите изменить значение на LoadingView
в потоке пользовательского интерфейса, прежде чем оценивать информацию об аутентификации.Используя этот подход, ваш код работает, но он может быть не тем, что вы хотите.
class AuthController : Controller() {
val authView : AuthView by inject()
val loadingView : LoadingView by inject()
fun tryAuth(login: String, password: String) {
authView.replaceWith(loadingView, ViewTransition.Fade(0.5.seconds))
runAsync {
// Simulate db access or http call
Thread.sleep(2000)
login == "admin" && password == "admin"
} ui { successful ->
if (successful) {
// doesn't work
loadingView.replaceWith(MainView::class, ViewTransition.Metro(0.5.seconds))
} else {
// doesn't work
loadingView.replaceWith(AuthView::class, ViewTransition.Fade(0.5.seconds))
}
}
}
}
class AuthView : View("Auth") {
val authController: AuthController by inject()
override val root = stackpane {
button(title).action {
authController.tryAuth("admin", "admin")
}
}
}
class LoadingView : View("Loading...") {
override val root = stackpane {
label(title)
}
}
class MainView : View("Main View") {
override val root = stackpane {
label(title)
}
}
Вы должны иметь в виду, что замена вида не изменит размер окна (хотя вы можете получить доступ к сцене и попросить изменить размер для текущего вида), поэтому вам лучше открыть каждый из них.вместо этого просмотрите в отдельном окне.