原文地址: 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()

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

TornadoFx 页面之间的数据传递的更多相关文章

  1. [Swift实际操作]八、实用进阶-(8)使用performSegue在故事板页面之间进行数据传递

    本文将演示故事板页面之间的数据传递.首先在一个空白项目中,打开项目自带的故事板文件(Main.storyboard).故事板中已经拥有了一个视图控制器,点击选择该视图控制器.然后依此点击[Editor ...

  2. HTML5中window.postMessage,在两个页面之间的数据传递

    HTML5中window.postMessage,在两个页面之间的数据传递 2015年11月3日 8536次浏览 关于postMessage window.postMessage虽然说是html5的功 ...

  3. 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递

    <view class='item' bindtap='onCountryTab' data-idx='4'> 1)bindtap属性用来设置控件需要绑定的函数,函数用单引号括起来:. 2 ...

  4. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  5. (转载)Javascript操作表单之间的数据传递

    (转载)http://www.aspxhome.com/javascript/skills/200710/214825.htm 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的 ...

  6. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

  7. 解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 进行传递 但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要 ...

  8. JSP、servlet、SQL三者之间的数据传递

    JSP.servlet.SQL三者之间的数据传递 博客分类: web开发 JSPservletSQL数据库连接池web开发  前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记, ...

  9. Activity之间的数据传递

    最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...

  10. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

随机推荐

  1. 四月十九号java基础知识

    1.总括:类的继承是使用已有的类为基础派生出新的类.通过类继承的方式,便能开发出新的类,而不需要编写相同的程序代码,所以说类的继承是程序代码再利用的概念抽象与接口都是类概念的扩展.通过继承扩展出的子类 ...

  2. 阿里云OSS服务 — 上传失败

    问题重现 使用PicGo + 阿里云对象存储搭建图床,一直都能够正常使用,在没有修改任何配置的情况下,上传图片一直失败. 出现如下错误: StatusCodeError: 403 - "&l ...

  3. 【Spring5】JdbcTemplate

    JdbcTemplate实现对数据库增删改查 步骤 导入Jar包 mysql-connector-java-8.0.28.jar:mysql数据库连接的相关依赖 spring-tx-5.2.6.REL ...

  4. 记一次 MySQL 主从同步异常的排查记录,百转千回

    你好,我是悟空. 这是悟空的第 183 篇原创文章 官网:www.passjava.cn 本文主要内容如下: 一.现象 最近项目的测试环境遇到一个主备同步的问题: 备库的同步线程停止了,无法同步主库的 ...

  5. Java中方法的定义和使用

    方法的定义和使用 注意事项: 1.方法与方法之间是 平级关系 不可以嵌套定义 2.方法的位置 可以在类{}中任意位置 3.方法定义之后 之后被调用 才能被执行 4.return 关键字的作用  返回关 ...

  6. 详解 APISIX Lua 动态调试插件 inspect

    作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者. 原文链接 为什么需要 Lua 动态调试插件? Apac ...

  7. Gusfield算法学习

    算法详解 等价流树正如其名,树上两点间的路径上的边权最小值为图上两点间的最小割. Gusfield算法就是建等价流树的一种算法.设当前正在处理的集合为 \(S(|S|\ge 2)\),从 \(S\) ...

  8. QUIC在京东直播的应用与实践

    作者:京东零售 周凯 一. 前言与背景 国内的互联网直播技术从2005年前后兴起,彼时最具代表性的直播产品是由PPLive创始人姚欣在华中科技大学就读期间发起的校园直播项目PPLive.当时的直播技术 ...

  9. python列表函数的基本使用

    一.列表简介 序列是Python最常见的操作,是最经常使用的一种数据操作.列表是当前序列中使用最多的. 序列中的每一个值对应的位置,称之为索引.通常情景下,第一个索引是位置为0,第二个索引位置为1.. ...

  10. golang在编程语言排行榜上排名第10,请不要说golang已死。

    四月头条:编程语言 Zig 进入 TIOBE 指数前 50 名 最近,我们讨论了高性能编程语言的出现.由于需要处理的数据量越来越大,这些编程语言正在蓬勃发展.因此,C 和 C++ 在前十名中表现良好, ...