¿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() } 
  • ¿Hay alguna manera de vincular una propiedad a appConfig en tornadofx?
  • TornadoFX cómo enlazar Node style (o styleClass) a una propiedad?
  • ¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?
  • TornadoFX - eliminar elemento con ContextMenu hacer clic derecho
  • El text de la label no se actualiza aunque el hilo de la interfaz de usuario parece responder
  • Animación consecutiva en TornadoFX?
  • tornadofx EventBus expande la fila de la tabla usando el object tableview
  • CellCache se representa inesperadamente en TableView con tornadoFX
  • Lanzar una aplicación TornadoFX desde (un progtwig existente) de Kotlin
  • Dibujando líneas desde ViewModel TornadoFX
  • Las properties vinculadas no funcionan