UserDialogs en Xamarin Forms
Creo que todos estamos de acuerdo en que Xamarin.Forms es fantástico... sin embargo no soluciona todos nuestros problemas cuando desarrollamos.
Una de las principales "fallas" es la falta de una forma avanzada de mostrar mensajes al usuario. Sí, sí, con Xamarin.Forms tenemos los métodos DisplayAlert
:
await DisplayAlert("Traditional alert", "Traditional message", "It's not so cool");
var result = await DisplayAlert("Traditional alert", "Traditional message?", "OK", "Cancel");
TraditionalPromptLabel.Text = string.Format("Result {0}", result);
Estos métodos solamente muestran un mensaje sencillo y permiten que el usuario responda con un valor booleano, y además requieren de tener una referencia a la página en la que queremos mostrar la alerta.
Es por eso que cuando queremos obtener más información de quien está usando nuesta app podemos recurrir a un paquete de NuGet que nos permitirá hacer operaciones como:
Mostrar un mensaje "Toast"
Con UserDialogs podemos mostrar mensajes en varias plataformas de manera que en Android lo hacemos con la popular Toast
:
UserDialogs.Instance.Toast("Toast message: <3", TimeSpan.FromMilliseconds(millis));
Mostrar un error
UserDialogs.Instance.ShowError("¡Error!", millis);
Mostrar un mensaje de éxito
UserDialogs.Instance.ShowSuccess("¡Éxito!", millis);
Pero no solo eso, también podemos recibir información a través de UserDialogs
PromptAsync
Solicitar información del usuario, ya sea que estés buscando un nombre, un teléfono, un password...
var promptConfig = new PromptConfig();
promptConfig.InputType = InputType.Name;
promptConfig.IsCancellable = true;
promptConfig.Message = "Write your name";
var result = await UserDialogs.Instance.PromptAsync(promptConfig);
if (result.Ok)
{
PromptedTextLabel.Text = result.Text;
}
PromptDateAsync
Solicitar una fecha, presentando un control muy familiar dependiendo de la plataforma en que se ejecute:
var result = await UserDialogs.Instance.DatePromptAsync(
"Select date",
DateTime.Now);
if (result.Ok)
SelectedDateLabel.Text = String.Format("{0:dd MMMM yyyy}", result.SelectedDate);
PromptTimeAsync
Al igual que con la fecha, este diálogo presenta un contol para seleccionar una hora
var result = await UserDialogs.Instance.TimePromptAsync(
"Select time",
DateTime.Now.TimeOfDay);
if (result.Ok)
SelectedTimeLabel.Text = String.Format("{0:hh-mm}", new DateTime(result.SelectedTime.Ticks));
PromptLoginAsync
Si quieres algo un poco más compuesto como una "pantalla" de login, también puedes usar esta pequeña librería:
var loginResult = await UserDialogs.Instance.LoginAsync("Login", "Please sign in");
if (loginResult.Ok)
{
PromptedLoginLabel.Text = String.Format("{0}:{1}", loginResult.Value.UserName, loginResult.Value.Password);
}
Inyección de dependencias
Como mencioné anteriormente el mecanismo de diálogos que provee Forms por default requieren de tener una referencia a la página en la que estamos trabajando, sin embargo UserDialogs no, y eso lo hace ideal para usarlo en conjunto con una solución de inyección de dependencias.
Personalización
En este post mostré únicamente las opciones más sencillas de esta librería, sin embargo también podemos personalizarla casi tanto como deseamos, es por eso que te propongo que descargues el código de ejemplo y practiques con él.
Instalación
Como siempre, hay que buscar en el gestor de paquetes de NuGet: Acr.UserDialogs
O desde la consola:
PM> Install-Package Acr.UserDialogs
Recuerda que si lo usas en Xamarin.Forms debes instalar Acr.UserDialogs en todos tus proyectos (núcleo y clientes) para que funcione correctamente.