es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Evento y EventHandle en Dart.

Vengo de C# y entiendo más o menos la lógica de los Eventos y cómo funcionan. Ahora, tengo que traducir un paradigma de evento (con paso de datos) de C# a Dart, pero no entiendo cómo funciona en Dart. ¿Alguien puede explicármelo pacientemente? Gracias.

EDIT: Estas son las piezas de código que tengo que traducir.

Clase Engine.cs

“`c#
public class Engine {
[…]
public event EventHandler<enginecomputationeventargs> ComputationCompleted;

<pre><code>protected virtual void OnComputationCompleted(Result result) {
var evt = ComputationCompleted;
if (evt != null) {
evt(this, new EngineComputationEventArgs(result));
}
}
</code></pre>

}

<pre><code><br />Clase Example.cs

“`c#
[…]

engine.ComputationCompleted += (sender, e) => {
Console.WriteLine(“PPE {0}”, e.Result.Ppe);
};

[…]

y EngineComputationEventArgs.cs

“`c#
public class EngineComputationEventArgs : EventArgs {

<pre><code>public EngineComputationEventArgs(Result result) {
Result = result;
}

public Result Result { get; private set; }
</code></pre>

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Dart también admite eventos y manejo de eventos similar a C#. En Dart, los eventos se representan mediante instancias de clases que extienden la clase Stream.

    Para definir un evento en Dart, primero debes declarar una instancia de StreamController utilizando el constructor StreamController.broadcast(). Luego puedes agregar un método get de tipo Stream a la clase que devuelva la propiedad stream del StreamController.

    Aquí tienes un ejemplo de cómo definir un evento en Dart:

    import 'dart:async';
    
    class Engine {
      // declarar el StreamController
      final _onComputationCompleted = StreamController<result>.broadcast();
    
      // declarar el getter para el stream
      Stream<result> get onComputationCompleted => _onComputationCompleted.stream;
    
      // definir un método para lanzar el evento
      void raiseOnComputationCompleted(Result result) {
        _onComputationCompleted.add(result);
      }
    }
    

    En este ejemplo, onComputationCompleted es el evento, y su tipo es Stream<result>. El método raiseOnComputationCompleted() se utiliza para lanzar el evento y pasar datos a los suscriptores.

    Para suscribirte al evento, puedes llamar al método listen() en la propiedad Stream del evento. El método listen() recibe una función de retorno de llamada que se ejecutará cuando se lance el evento. Aquí tienes un ejemplo:

    final engine = Engine();
    
    engine.onComputationCompleted.listen((result) {
      print('PPE ${result.ppe}');
    });
    

    En este ejemplo, nos suscribimos al evento onComputationCompleted utilizando el método listen(). La función de retorno de llamada se ejecutará cuando se lance el evento y recibirá los datos Result que se pasaron desde el método raiseOnComputationCompleted().

    Para pasar datos con el evento, simplemente debes pasarlo como argumento al método raiseOnComputationCompleted(). En Dart, puedes pasar cualquier objeto como argumento al método add() del StreamController.

    ¡Espero que esto te ayude! Avísame si tienes alguna pregunta adicional.

Comments are closed.