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