首页 > 其他分享 >TornadoFx 页面之间的数据传递

TornadoFx 页面之间的数据传递

时间:2023-07-01 13:33:38浏览次数:56  
标签:传递 val TornadoFx 300.0 closeAction 页面 type View

原文地址: TornadoFx 页面之间的数据传递 - Stars-One的杂货小窝

和Android开发一样,经常遇到两个页面之间需要进行数据的交互传输,本文讲解下TornadoFx框架中,页面之间的数据传递步骤方法

方法1 - 使用构造方法

首先,我们知道TornadoFx中,页面可以是View或Fragment,然后View或Fragment对象中提供了对应的打开窗口的方法

比如说

  • openModal
  • openWindow
  • openInternalWindow

3种方法就是窗口模式有些不同,具体说明可以参考此文档3. Components

而我们需要传递数据,最简单的一种方法就是通过构造方法去传,如下面例子

class TestParamView : View("My View") {
    override val root = vbox {
        setPrefSize(300.0,300.0)

        button("跳转页面") {
            action {
                TestParamAView(1).openModal()
            }
        }
    }
}


class TestParamAView(val type:Int) : View() {

    override val root = vbox {
        setPrefSize(300.0,300.0)
        text(type.toString())

    }
}

效果如下所示:

那么,如果需要页面结束回传数据呢?

这里,TornadoFx默认没有相关方法,我们只能自己改造着实现了

既然我们可以传参,那么,我们也可以将函数回调传入,之后新页面关闭之前回调一下我们的方法即可实现上述要求

假设我们需要新页面返回String类型的数据,具体代码如下:

class TestParamView : View("My View") {
    override val root = vbox {
        setPrefSize(300.0, 300.0)

        button("跳转页面") {
            action {
                val closeAction = { s: String ->
                    println("这是返回的数据: $s")
                }
                TestParamAView(1, closeAction).openModal()
            }
        }
    }
}


class TestParamAView(val type: Int, closeAction: (String) -> Unit) : View() {

    override val root = vbox {
        setPrefSize(300.0, 300.0)
        text(type.toString())

        button("返回数据") {
            action {
                closeAction.invoke("数据11")
                close()
            }
        }
    }
}

效果如下,可以看见控制台也是已经输出了返回的数据

上面流程,我们需要手动在调用close方法前才回调closeAction,如果想要点击页面右上角关闭而返回的话,应该怎么做?

View和Fragment有对应的生命周期,在onUndock()方法来实现拦截即可

class TestParamView : View("My View") {
    override val root = vbox {
        setPrefSize(300.0, 300.0)

        button("跳转页面") {
            action {
                val closeAction = { s: String ->
                    println("这是返回的数据: $s")
                }
                TestParamAView(1, closeAction).openModal()
            }
        }
    }
}


class TestParamAView(val type: Int, closeAction: (String) -> Unit) : View() {

    override val root = vbox {
        setPrefSize(300.0, 300.0)
        text(type.toString())

        button("返回数据") {
            action {
                close()
            }
        }
    }
    
    override fun onUndock() {
        super.onUndock()
        closeAction.invoke("数据11")
    }
}

之后不管是通过代码触发close方法还是点击页面右上角,最终都会走到onUndock方法里去

然后剩下的就是逻辑完善了,比如在什么时机传回数据,传回其他类型的数据,各位参考上面思路即可

方法2 - 使用param()方法

如果说你的使用情景中,打开的View或Fragment都是固定的一个对象,可以使用TornadoFx框架提供的find方法来打开页面

find方法里同时提供了传参使用,如下面例子:

class TestParamView : View("My View") {
    override val root = vbox {
        setPrefSize(300.0, 300.0)

        button("跳转页面") {
            action {
                val closeAction = { s: String ->
                    println("这是返回的数据: $s")
                }
                find<TestParamAView>(
                    mapOf(
                        TestParamAView::type to 1,
                        TestParamAView::closeAction to closeAction

                    )
                ).openModal()
            }
        }
    }
}


class TestParamAView() : View() {
    val type: Int by param()
    val closeAction: (String) -> Unit by param()

    override val root = vbox {
        setPrefSize(300.0, 300.0)
        text(type.toString())

        button("返回数据") {
            action {
                close()
            }
        }
    }

    override fun onUndock() {
        super.onUndock()
        closeAction.invoke("数据11")
    }

}

传承需要传递有个map集合,TestParamAView::type是反射的用法,实际上就是得到结果就是一个字符串type,直接定义为"type"也是可行的,因为要相同的key才能注入参数,用反射的用法可以避免写错导致的不匹配问题

而在需要接受参数页面内,通过param的委托方法来获取数据

如果说你的情景可能参数会传空,可以定义类型为空类型

 val type: Int? by param()

之后的返回参数和上面章节一样,不再赘述

标签:传递,val,TornadoFx,300.0,closeAction,页面,type,View
From: https://www.cnblogs.com/stars-one/p/17519173.html

相关文章

  • [转]前台传递给后台的JSON字符串中的引号 “” 在JAVA后台被转义为 &quot
    1、问题:前台数据,JSON字符串带有引号“”,数据被传递到后台,引号被转义为&quot,后台无法解析。前台数据如下:正常后台数据如下:大部分正常,只有JSON字符串中的“”被转义为&quot2、解决:方法一:使用apache的lang包里的方法StringappJson=StringEscapeUtils.un......
  • 双写一致性之定时更新、异步发送短信、异步秒杀逻辑前后端、课程页页面前端、课程相关
    目录一、双写一致性之定时更新任务逻辑二、异步发送短信视图函数任务三、异步秒杀逻辑前后端1.1前端Sckill.vue视图类路由任务四、课程相关表分析先创建一个course.app表数据迁移表六、课程表数据录入七、课程主页接口一、双写一致性之定时更新任务逻辑@app.taskdefupdate......
  • laytpl( Layui 的一款轻量 JavaScript 模板引擎)html标签点击事件传递多参
     <scripttype="text/html"id="aobjectvalue_temp"><spanclass="us-font-blue"style="cursor:pointer"onclick="seeinfo('{{d.aobjectkey}}','{{d.atype}}')">[资源详情]</spa......
  • 小程序实现页面转图片
    要实现一个小程序页面转图片的需求,类似于用户编辑了一些内容,上传了一些头像,然后生成几十张图片,供用户下载转发及生成pdf等等,实验了以下方案:1.wxml2canvas微信提供的解决方案,写起来很麻烦,页面样式还有好多不支持,pass2.webview+html2canvas在小程序里通过webview打开一个外部页......
  • Vue3 reactive 操作数组 响应性(数组变了,但页面显示没变)问题
    问题代码:tableTemplates:Array<HkTaskTemplateEntity>=reactive([]);//删除方法的一部分,根据templateId删除数组数据this.tableTemplates=this.tableTemplates.filter(item=>templateId!==item.templateId);删除后tableTemplates数组中对象减少,但vue页面显示数据......
  • 登录页面
    <!DOCTYPEhtml><html><head><title>Register</title><style>body{font-family:Arial,sans-serif;background-color:#f4f4f4;}.container{max-width:400px;......
  • 餐厅页面
    <!doctypehtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-sc......
  • 关于HTML页以Get方法向asp.net页面传值乱码的解决
    这个问题是最近偶然发现的,朋友说我个人做那个基于Lucene的搜索引擎,存在一个问题,就是只能搜索英文,不能搜索中文。我把代码仔细看了一下,没发现问题,但是在测试的时候确实存在这样的问题。我查看传值之后的参数,全部是乱码或者空格,立即觉得是传递过程中编码的问题。后来在web.config中添......
  • [GPT] vue 的 quasar 框架 在 layout 模版中 如何获取 子页面当前使用的 useMeta
     在Quasar框架中,用VueRouter的meta字段来获取子页面当前使用的useMeta。首先,您需要在路由配置中设置子页面的meta字段。例如:  constroutes=[{path:'/page',component:PageComponent,meta:{useMeta:{//在这里定义您......
  • 注册功能 ,前端登录注册页面
    目录1异步发送短信1.1视图类1.2序列化类加入万能验证码2注册功能3.1视图类3.2序列化类补充3前端注册页面分析3.1Header.vue3.2Login.vue4前端登录注册页面复制4.1Login.vue4.2Register.vue4.3Header.vue5前端登录功能6前端注册功能1异步发送短信#原来的发送短......