TornadoFX向导:阻止移动到下一页,直到异步任务完成

时间:2019-02-20 13:39:31

标签: tornadofx

我尝试配置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时,是否有一种更优雅的方法来执行一些耗时的异步任务?

1 个答案:

答案 0 :(得分:0)

尝试不成功后,我通过以下方法解决了问题:

我创建了一个加载视图:

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()
}