TornadoFX 向导:阻止移动到下一页,直到异步任务完成
TornadoFX wizard: block move to next page until async task completed
我尝试配置 TornadoFX 向导页面,我的其中一个页面有一个选项。此选择调用加载数据的较长时间任务。因此在选择更改时的页面上我只设置了一种代理值(BoardDefinition 类型):
private fun loadBoard(def: BoardDefinition) {
scope.boardDef = def
}
有了这个,我避免在用户做出决定时加载不必要的数据。我的意图是,只有当用户决定继续前进时,代理才会放松并加载数据。
我尝试将加载部分移动到 onSave
,但加载是异步的,向导移至下一页(并且该页面尝试使用仍在加载中的数据):
override fun onSave() {
runAsync {
showProgress(
"Játéktábla betöltése",
"A játéktábla betöltése folyamatban",
ProgressDialog.ProgressMode.INDICATOR,
this
)
// This lazy initialization performs the long-time data loading
scope.board = scope.boardDef.board
} ui {
ProgressDialog.hide()
super.onSave()
}
}
我有几个解决这个问题的想法。我可以创建一个 Future 对象并在数据可用时阻止 onSave 的执行。或者我可以添加一个只加载数据的页面,并设置 onComplete 属性 以监视加载是否结束。两者看起来都像是黑客攻击。当用户按下 Next
?
时,是否有更优雅的方法来执行一些耗时的异步任务
在尝试了一些不成功之后,我用这个方法解决了这个问题:
我创建了一个加载视图:
class LoadBoardView : View() {
class Scope(val source: <Your source type>, var loaded: <Your loaded type>)
: tornadofx.Scope()
override val scope = super.scope as Scope
override fun onDock() {
super.onDock()
runAsync {
// Do the loading into scope.loaded
} ui {
close()
}
}
}
此视图在显示后立即开始加载并在完成后自行关闭。
在我的向导页面中,我只是使用阻塞执行:
override fun onSave() {
val loaderScope = LoadBoardView.Scope(<your id to load>)
find<LoadBoardView>(loaderScope).apply {
openModal( block = true)
}
// Get loaded value from loaderScope.loaded
super.onSave()
}
我尝试配置 TornadoFX 向导页面,我的其中一个页面有一个选项。此选择调用加载数据的较长时间任务。因此在选择更改时的页面上我只设置了一种代理值(BoardDefinition 类型):
private fun loadBoard(def: BoardDefinition) {
scope.boardDef = def
}
有了这个,我避免在用户做出决定时加载不必要的数据。我的意图是,只有当用户决定继续前进时,代理才会放松并加载数据。
我尝试将加载部分移动到 onSave
,但加载是异步的,向导移至下一页(并且该页面尝试使用仍在加载中的数据):
override fun onSave() {
runAsync {
showProgress(
"Játéktábla betöltése",
"A játéktábla betöltése folyamatban",
ProgressDialog.ProgressMode.INDICATOR,
this
)
// This lazy initialization performs the long-time data loading
scope.board = scope.boardDef.board
} ui {
ProgressDialog.hide()
super.onSave()
}
}
我有几个解决这个问题的想法。我可以创建一个 Future 对象并在数据可用时阻止 onSave 的执行。或者我可以添加一个只加载数据的页面,并设置 onComplete 属性 以监视加载是否结束。两者看起来都像是黑客攻击。当用户按下 Next
?
在尝试了一些不成功之后,我用这个方法解决了这个问题:
我创建了一个加载视图:
class LoadBoardView : View() {
class Scope(val source: <Your source type>, var loaded: <Your loaded type>)
: tornadofx.Scope()
override val scope = super.scope as Scope
override fun onDock() {
super.onDock()
runAsync {
// Do the loading into scope.loaded
} ui {
close()
}
}
}
此视图在显示后立即开始加载并在完成后自行关闭。
在我的向导页面中,我只是使用阻塞执行:
override fun onSave() {
val loaderScope = LoadBoardView.Scope(<your id to load>)
find<LoadBoardView>(loaderScope).apply {
openModal( block = true)
}
// Get loaded value from loaderScope.loaded
super.onSave()
}