O MessagingCenter é uma boa opção quando pensamos em publicar eventos de forma dinâmica nos projetos Xamarin Forms. Podemos por exemplo, disparar um evento em um service de um projeto Android (plataforma específica) e escutá-lo em uma ViewModel no projeto .Net Standart.

O MessagingCenter implementa a interface IMessagingCenter que permite pedirmos este objeto no construtor e recebe-lo por um container de injeção de dependência. Existem algumas limitações no uso do MessagingCenter, e pensando nisto neste post iremos tratar de uma opção para ele, o EventAggregator do Prism.

Eu ja falei sobre Prism aqui no blog antes, se você ainda conhece o Prism, recomendo que você leia este artigo antes de ler este.

EventAgreggator

O EventAggregator do Prism contém um mecanismo de eventos que nos permite disparar eventos a partir de um emissor para um ou mais receptores que estejam no projeto .Net Standart ou plataformas específicas. Veja a arquitetura do EventAggregator na imagem abaixo:

event aggregator

Ele é muito parecido com o MessagingCenter. Ambos implementam uma interface e nos permitem receber o objeto através de container de injeção de dependências.

Entretanto o EventAggregator possui algumas vantagens sobre o MessagingCenter: Você pode criar eventos com objetos complexos e escolher em qual Thread você irá realizar ações quando o evento ocorrer.

IEventAggreggator

Vale lembrar que você somente poder utilizar o EventAggregator se estiver utilizando o Prism em seu projeto.

A classe EventAggregator é provida pelo container de injeção de dependências. Você pode pedir uma instância do EventAggregator por meio da interface IEventAggregator. O EventAggregator é responsável por localizar ou criar eventos e por manter a coleção dos eventos no sistema.

Criando um evento

Como falei mais acima, o EventAggregator trabalha com eventos customizados, para isto, ele irá utilizar uma classe que criamos que herde de PubSubEvent

Para a criar a classe precisamos informar qual o tipo do evento que esta classe publica e escuta. Veja no exemplo abaixo:

public class NovaMensagemEvent : PubSubEvent<string>{}

Observe que estamos dizendo que nosso evento NovaMensagemEvent será um objeto do tipo string. Poderíamos aqui passar qualquer outro tipo como int, double ou um objeto complexo.

Publicando um evento

Como falei acima, vamos precisar pedir o objeto concreto EventAggregator ao container de injeção de dependências, veja abaixo

public class MainPageViewModel
{
    IEventAggregator _eventAggregator;
    public MainPageViewModel(IEventAggregator ea)
    {
        _eventAggregator = ea;
    }
}

Depois de obtermos a instância do EventAggregator, podemos publicar o evento com base no nosso evento NovaMensagemEvent utilizando o método Publish do objeto _eventAggregator

_eventAggregator.GetEvent<NovaMensagemEvent>().Publish("Minha Mensagem");

Escutando um evento

Para capturar o evento quando ele ocorrer e realizar alguma ação vamos utilizar o método Subscribe também do EventAggregator que é sobrecarregado pelo tipo do nosso evento customizado o EventAggregator

public class MensagensViewModel
{
    public MensagensViewModel(IEventAggregator ea)
    {
        ea.GetEvent<NovaMensagemEvent>().Subscribe(NovaMensagem, ThreadOption.UIThread);
    }
    void NovaMensagem(string mensagem)
    {
        App.Current.MainPage.DisplayAlert("Nova Mensagem!", mensagem, "ok");
    }
}

A grande sacada aqui é que podemos dizer em qual Thread queremos tratar o evento quando ele ocorrer e isto nos ajuda em muita coisa. Se quisermos exibir um alerta com a nova mensagem por exemplo, não precisaremos checar se estamos na Main thread com o método Device.BeginInvokedOnMainThread .

Existem três opções de Threads para utilizarmos:

  • PublisherThread: Recebe o evento na mesma thread em que foi publicado.
  • BackgroundThread: Recebe de forma assíncrona o evento na thread-pool do .NET Framework.
  • UIThread: Recebe o evento na UI thread.

Para que o evento seja publicado na UI Thread do usuário, o EventAggregator deve inicialmente ser construído também na UI Thread

Conclusão

O EventAggregator pode nos ajudar em diversos cenários no desenvolvimento do nosso app ao trabalhar com eventos. Importante lembrar que ele pertence a biblioteca do Prism, então para utiliza-lo você precisará da biblioteca do Prism.

#Ubuntu

Imagem utilizada no post https://pixabay.com/pt/photos/cristal-cora%C3%A7%C3%A3o-espelho-brilhar-245288/

Modificado pela ultima vez: 15 de maio de 2020

Comentários

Escreva uma resposta ou comentário

Seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.