首页 > 解决方案 > 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

标签: tornadofx

解决方案


在一些不成功的尝试之后,我用这个转折解决了这个问题:

我创建了一个加载视图:

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

推荐阅读