¿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() } 
  • En TornadoFX, ¿cómo puedo vincular las properties de BigDecimal a otra propiedad de BigDecimal usando objectBinding?
  • ¿Por qué mi escena es nula?
  • Desplazamiento suave en JavaFX TableView
  • tornadoFX togglebutton no tiene propiedad de text
  • Enlazando una vista a una propiedad de controller cambiante
  • Cómo mostrar datos usando la vista de tree de TornadoFX
  • TornadoFX filechooser
  • TornadoFX con TestFX cierra la vista después de cada TestCase
  • Tornadofx Javafx - Cómo volver a cargar una vista / componente
  • TornadoFX reemplaza el layoutChildren en la región
  • Animación consecutiva en TornadoFX?