Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Assinatura no Tipo de Mensagem.

Olá. Estou com uma dúvida neste trecho do código:

protected override void OnAppearing()
{
    base.OnAppearing();
    MessagingCenter.Subscribe<object>(this, "SomaCalculada",
        (msg) =>
        {
            DisplayAlert("Soma", 
            string.Format("O resultado da soma é: {0}", msg), "Ok");
        });
}

Se o tipo da mensagem enviada é um decimal, porque estamos recebendo um object? Inclusive, na hora de usar o send, do método da CalculadoraViewModel, estamos enviando um decimal, como podemos ver no código abaixo:

public class CalculadoraViewModel
{
    public void CalculaSoma(decimal parcela1, decimal parcela2)
    {
        decimal soma = parcela1 + parcela2;
        MessagingCenter.Send<object>(soma, "SomaCalculada");
    }
}
3 respostas
solução!

Olá, Guilherme

Tive que revisar o código do exercício agora, pois estava errado.

Acontece que, na forma como estava sendo usado, o primeiro tipo que estávamos passando (object) deveria ser o tipo do emissor (TSender), isto é, a classe que envia os dados (CalculadoraViewModel):

public static void Send<TSender>(TSender sender, string message) where TSender : class

O que deveria ser feito é utilizar o overload do método que passa não só o tipo do emissor, como também o tipo da mensagem:

public static void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class;

Por isso, tive que modificar o exercício para utilizar esses dois tipos nos métodos genéricos Send e Subscribe:

    MessagingCenter.Send<CalculadoraViewModel, decimal>(this, "SomaCalculada", soma);

E também:

    MessagingCenter.Subscribe<CalculadoraViewModel, decimal>(this, "SomaCalculada",
        (sender, msg) =>
        {
            DisplayAlert("Soma", 
            string.Format("O resultado da soma é: {0}", msg), "Ok");
        });

Assumo que foi um erro meu, por não ter observado isso antes. Note que, durante o curso, na verdade, usamos o objeto mensagem no lugar que deveria ser o objeto emissor, porém isso não prejudicou o funcionamento da aplicação. Por favor utilize o formato atualizado no exercício nas suas aplicações.

Muito obrigado, Marcelo! Aprendi mais essa!

Eu que agradeço sua participação, Guilherme! Abs!