![]()  | 
    Neste artigo veremos como criar uma página de Login com MVVM e usar a base de dados Firebase para armazenar as credenciais do usuário. | 
O Firebase é mais um dos serviços do Google e ele possui muitas funcionalidades, e, a que iremos usar neste artigo será a funcionalidade Databases.
Criando a conta e o configurando o Firebase
A primeira coisa a fazer é criar uma conta no Firebase acessando o Firebase Console.
Se você tiver uma conta ou após você se registrar e fazer o login será a apresentada a tela abaixo onde podemos adicionar um novo projeto clicando em : Adicionar projeto

A seguir informe o nome do projeto e clique em Continuar:

A seguir desative o Google Analytics e clique no botão para criar o projeto:

Se houver qualquer dúvida consulta a documentação aqui : https://firebase.google.com/docs?authuser=0
Ao final seu projeto será criado e você pode clicar em Continuar:

Vamos agora incluir o Firebase em nosso projeto. Para isso clique em Database:

A seguir clique em : Criar banco de dados

Agora selecione a opção : iniciar no modo de teste e cliqem no botão : Próxima:

Observe que neste modo qualquer pessoa que possua a referência ao nosso banco de dados vai poder visualizar, editar e deletar todos os dados do banco de dados.
Para concluir defina a localização de armazenamento aceitando o valor padrão e clicando em Concluido:

Seu banco de dados já esta pronto para ser usado. A seguir vamos clicar em - Cloud Firestore:

Vamos selecionar a opção Realtime Database

Pronto. Seu banco agora possui um link de referência - https://xamarinfirestore-bc526.firebaseio.com/ - que será usado para fazer o acesso.
Obs: O seu link deverá ser diferente do mostrado aqui.

Temos que alterar as regras de acesso aos dados pois por padrão a leitura e a escrita estão definidos como false e assim não será possível ler nem escrever dados.

Clique em Regras e altera a regra de acesso conforme mostra a figura:

Após clicar em Publicar seu banco Firebase estará pronto para ser acessado e você poderá ler e escrever dados.

Assim a parte de configuração do Firebase esta concluída e podemos continuar com o Xamarin Forms.
Recursos usados:
Criando o projeto Xamarin Forms
Vamos criar um novo projeto Xamarin Forms no VS 2019 Community com o nome XF_LancheApp.
Nota: Verifique se você precisa atualizar as versões do Xamarin Forms e do Xamarin.Essentials
Você pode ver como criar um projeto no Xamarin Forms neste link: Criar Projeto Xamarin Forms
A seguir vamos incluir os seguintes pacotes no projeto criado:
   

   

   

A seguir vamos criar as seguintes pastas no projeto compartilhado que iremos usar em nossa aplicação:
No projeto Android, na pasta Resources/drawable vamos incluir o arquivo logorede1.jpg que iremos usar na página de Login.
Na pasta Models crie a classe User que representa um usuário que vai acessar nossa aplicação e que possui um nome e uma senha:
| 
		    
		public class User { public string Username { get; set; } public string Password { get; set; } }  | 
	
Agora vamos criar a classe UserService onde vamos implementar a funcionalidades para acessar nossa base de dados Firebase e verificar se o usuário existe, fazer o login e o registro de um novo usuário.
Aqui vamos usar o 
link de referência ao nosso banco de dados Firebase que para a minha conta tem o 
seguinte valor:
https://xamarinfirestore-bc526.firebaseio.com/.
Iremos usar também a referência à biblioteca Firebase.Database e Firebase.DatabaseQuery onde vamos usar classe FirebaseClient e definir os métodos:
Para isso crie a classe UserService na pasta Services:
		using Firebase.Database;
using Firebase.Database.Query;
using System.Linq;
using System.Threading.Tasks;
using XF_LancheApp.Models;
		namespace XF_LancheApp.Services { public class UserService { FirebaseClient client; public UserService() { client = new FirebaseClient("https://xamarinfirestore-bc526.firebaseio.com/"); } public async Task<bool> IsUserExists(string name) { var user = (await client.Child("Users") .OnceAsync<User>()) .Where(u => u.Object.Username == name) .FirstOrDefault();             return (user != null);
        }
        public async Task<bool> RegisterUser(string name, string passwd)
        {
            if (await IsUserExists(name) == false)
            {
                await client.Child("Users")
                    .PostAsync(new User()
                    {
                        Username = name,
                        Password = passwd
                    });
                return true;
            }
            else
            {
                return false;
            }
        }
		        public async Task<bool> LoginUser(string name, string passwd)
        {
            var user = (await client.Child("Users")
                .OnceAsync<User>())
                .Where(u => u.Object.Username == name)
                .Where(u => u.Object.Password == passwd)
                .FirstOrDefault();
		            return (user != null);
        }
    }
}
		 | 
	
Assim temos nosso serviço pronto para acessar o Firebase, realizar o login e fazer o registro de um novo usuário.
No código acima será criada a coleção Users e as propriedades Username e Password no Firebase.
Como vamos usar a abordagem MVVM vamos criar agora a view model relacionada com a classe User e com a view LoginView que iremos criar a seguir.
Para isso teremos que criar a view model LoginViewModel que implementa a interface INotifyPropertyChanged assim vamos criar uma classe BaseViewModel onde teremos a implementação desta interface e a seguir todas as demais view models poderão herdar desta classe base e assim otimizamos nosso código.
Na pasta ViewModels crie a classe BaseViewModel:
		using System.ComponentModel;
using System.Runtime.CompilerServices;
		namespace XF_LancheApp.ViewModels
{
    public class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string name = "") => 
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));       
		    }
}
		 | 
	
Ainda na pasta ViewModels vamos criar agora a view model LoginViewModel que herda de BaseViewModel:
		using System;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;
using XF_LancheApp.Services;
using XF_LancheApp.Views;
		namespace XF_LancheApp.ViewModels
{
    public class LoginViewModel : BaseViewModel
    {
        private string _Username;
        public string Username
        {
            set
            {
                this._Username = value;
                OnPropertyChanged();
            }
            get
            {
                return this._Username;
            }
        }
        private string _Password;
        public string Password
        {
            set
            {
                this._Password = value;
                OnPropertyChanged();
            }
            get
            {
                return this._Password;
            }
        }
        private bool _Result;
        public bool Result
        {
            set
            {
                this._IsBusy = value;
                OnPropertyChanged();
            }
            get
            {
                return this._IsBusy;
            }
        }
        private bool _IsBusy;
        public bool IsBusy
        {
            set
            {
                this._Result = value;
                OnPropertyChanged();
            }
            get
            {
                return this._Result;
            }
        }
        public Command LoginCommand { get; set; }
        public Command RegisterCommand { get; set; }
		        public LoginViewModel()
        {
            LoginCommand = new Command(async () => await LoginCommandAsync());
            RegisterCommand = new Command(async () => await RegisterCommandAsync());
        }
		        private async Task RegisterCommandAsync()
        {
            if (IsBusy)
                return;
            try
            {
                IsBusy = true;
                var userService = new UserService();
                Result = await userService.RegisterUser(Username, Password);
                if (Result)
                    await Application.Current.MainPage.DisplayAlert("Sucesso", "Usuário Registrado", "Ok");
                else
                    await Application.Current.MainPage.DisplayAlert("Erro", "Falha ao registrar usuário", "Ok");
            }
            catch (Exception ex)
            {
		                await Application.Current.MainPage.DisplayAlert("Erro", ex.Message, "Ok");
            }
            finally
            {
                IsBusy = false;
            }
        }
		        private async Task LoginCommandAsync()
        {
            if (IsBusy)
                return;
            try
            {
                IsBusy = true;
                var userService = new UserService();
                Result = await userService.LoginUser(Username, Password);
                if (Result)
                {
                    Preferences.Set("Username", Username);
                    await Application.Current.MainPage.Navigation.PushAsync(new ProdutosView());
                }
                else
                {
                    await Application.Current.MainPage.DisplayAlert("Erro", "Usuário/Senha inválido(s)", "Ok");
                }
            }
            catch (Exception ex)
            {
                await Application.Current.MainPage.DisplayAlert("Erro", ex.Message, "Ok");
            }
            finally
            {
                IsBusy = false;
            }
        }
    }
}
		 | 
	
No código acima estamos definindo as propriedades e os comandos usados para realizar o login e o registro do usuário e estamos usando o serviço UserServive e os métodos LoginUser e RegisterUser para realizar esta tarefa.
Temos assim tudo pronto e já podemos criar a nossa view LoginView e a view ProdutosView para a qual iremos navegar quando o login for realizado com sucesso.
Faremos isso na próxima parte do artigo. Aguarde...
"Mas, não vos alegreis porque se vos sujeitem os 
espíritos; alegrai-vos antes por estarem os vossos nomes escritos nos céus."
Lucas 10:20
Referências:
NET - Apresentando o padrão Model-View-ViewModel
Xamarin Forms - MVVM - Macoratti.net
NET - O padrão MVVM (Model-View-ViewModel) revisitado
Xamarin Forms - MVVM - A interface ICommand -
Padrão de Projeto - Aprendendo o padrão MVVM ...