¿Cómo cancelar la suscripción a events en TornadoFX?

En TornadoFX quiero cancelar la suscripción a un evento personalizado para que el receptor nunca vuelva a manejar los events innecesarios, y tal vez evitar algo como pérdidas de memory, sin embargo, cuando uso el método de unsubscribe<MyEvent> en mi código, no funciona en absoluto . Aquí está la parte de mi código:

 object MyEventObj: FXEvent(EventBus.RunOn.BackgroundThread) class MyEventBus(val personlist:List<PersonOld>): FXEvent() class MyController: Controller() { init { subscribe<MyEventObj> { unsubscribe<MyEventObj> { println("Unsubscribe event!") //unsubscrib event and make sure the next code just runs once, but never works! } println("Event has received!") val items = listOf(PersonOld("Name A", 20), PersonOld("Name B", 25)) fire(MyEventBus(items)) } } } 

¿Entonces, cuál es el problema? ¿Y cómo utilizar la unsubscribe de unsubscribe en TornadoFX? ¡Gracias por ayudarme de antemano!

La function de unsubscribe toma el detector de events como su único parámetro. Para poder cancelar la suscripción, por lo tanto, debe save el oyente como miembro val para que pueda hacer reference a él. Para hacer las cosas más interesantes, no puede hacer reference a this dentro del oyente mismo, por lo que necesita llamar a otra function para poder darse de baja exitosamente. Aquí hay un ejemplo completo:

 object MyEvent : FXEvent() class MyView : View() { override val root = stackpane { paddingAll = 100 button("Fire!") { setOnAction { fire(MyEvent) } } } val myListener: (MyEvent) -> Unit = { alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.") stopListening() } init { subscribe(myListener) } fun stopListening() = unsubscribe(myListener) } 

Si fuera posible hacer reference al oyente desde su interior, podríamos haber agregado una llamada a unsubscribe() directamente dentro del oyente, pero eso no es posible, al less no con Kotlin 1.0.

EDITAR: acabamos de agregar un parámetro times = n para suscribir, por lo que no es necesario que se ocupe de cancelar el logging usted mismo. Por defecto, su detector de events se activará cada vez que se active el evento, pero al pasar 1 , puede anular el logging automáticamente después de la primera vez. Con esta nueva característica, incluida en TornadoFX 1.6.3, simplemente puede hacer esto:

 class MyView : View() { override val root = stackpane { paddingAll = 100 button("Fire!") { setOnAction { fire(MyEvent) } } } init { subscribe<MyEvent>(times = 1) { alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.") } } } 

EDIT2: TornadoFX 1.6.3 también introducirá un EventContext cual opera el disparador, por lo que podrá unsubscribe() dentro del detector de events desde la próxima versión. Luego puede hacer esto como una alternativa al parámetro de times :

 subscribe<MyEvent> { alert(Alert.AlertType.INFORMATION, "Event received!", "This message should only appear once.") unsubscribe() } 
  • Cómo mostrar datos usando la vista de tree de TornadoFX
  • Cómo cambiar la vista en TornadoFx
  • TornadoFX cómo agregar validation al editar TableView
  • tornadoFX togglebutton no tiene propiedad de text
  • CellCache se representa inesperadamente en TableView con tornadoFX
  • Enlace de un model de dominio con campos anulables en ItemViewModel
  • Crea una vista arbitraria
  • TornadoFX con TestFX cierra la vista después de cada TestCase
  • TornadoFX - Creación de un layout MVP
  • java.lang.ClassNotFoundException: no encontró la class "com.my.app.example.Main" en la ruta: DexPathList
  • El elemento TornadoFx ItemViewModel es nulo